うにてぃブログ

主にUnityとC#に関する記事を書いていきます

2020-07-01から1ヶ月間の記事一覧

【Unity】GUIStyle の 描画領域 を予め取得する

GUIStyle.CalcSize を使うことで GUIStyle で GUIContent を描画する場合の 縦横を取得できるメソッドがある Unity - Scripting API: GUIStyle.CalcSize これを利用すると Rect の領域を知ることができる そのため、下記記事のように GUILayout.FlexibleSpac…

【Unity】TreeView の拡張に利用できる変数一覧

showAlternatingRowBackgrounds 背景色を1行ずつ変更する showBoarder TreeViewの描画枠に枠線を表示する Border無しBorder有り depthIndentWidth 子要素を表示させた際のインデント幅 (100) useScrollView Viewをスクロール可能にするかどうか customFoldou…

【Unity】TreeView の Override メソッド一覧

BuildRoot BuildRows GetRows OnGUI SelectionChanged SingleClickedItem DoubleClickedItem ContextClickedItem ContextClicked ExpandedStateChanged SearchChanged KeyEvent GetDescendantsThatHaveChildren CanMultiSelect CanRename RenameEnded CanSta…

【Unity】検索窓付きの TreeView サンプル

using System.Collections.Generic; using UnityEditor; using UnityEditor.IMGUI.Controls; using UnityEngine; public class SearchTreeViewSample : EditorWindow { [MenuItem("Tools/SampleTreeView")] private static void ShowWindow() { GetWindow<SearchTreeViewSample>();</searchtreeviewsample>…

【Unity】UnityEditor 上で アセットバンドルネームのついているアセットを探す

AssetDatabase.GetAssetPathsFromAssetBundle を利用することで Asset に設定してある assetBundleName が一致するアセットのパスを取得できます アセットバンドル名は重複を許可しているため、複数のパスが取得することができるので注意が必要です using Un…

【C#】空 Action を渡す

例えば以下のメソッドがあり、null は指定したくないが、何も処理したくない場合がある private void CallAction(Action action) その場合は () => { } を渡してやれば何を処理をしない CallAction(() => { }); 他には ReorderableList 等で コールバックを…

【Unity】Unity の Assembly 定義について

Unity の Assembly はディレクトリに応じて下記 4つに分類されます Assembly-CSharp Assembly-CSharp-Editor Assembly-CSharp-firstpass Assembly-CSharp-Editor-firstpass 各 Assembly の分類は以下のような条件で行われます Assembly 条件 Assembly-CSharp…

【Unity】ReorderableList の GUI を作り変える

ReorderableList のデフォルト GUI は右下に + と - があり 削除する際は要素を選択してから - を押す必要があり面倒だったので、GUI を変更してみました using UnityEditor; using UnityEditorInternal; using UnityEngine; public class SampleMonoBehavio…

【Unity】スタックトレースを確認する

StackTraceUtility.ExtractStackTrace() を利用すると Debug.Log で表示しているような スタックトレースを取得することができます ログには出したくないが、スタックトレースのみほしい場合に利用することができます

【Unity】昔 Vector2.Lerp や Vector3.Lerp が重いと言われていた気がするので調べてみた

https://github.com/Unity-Technologies/UnityCsReference から 2017.1 の処理を見たのですが、特に重そうな処理をしておらず Mathf.Lerp を要素分計算しているだけだった もしかしたら Unity4系 だったら処理が違ったのかもしれないが、古いので調査は断念…

【C#】XY のループが面倒なので拡張してみた

通常 x と y のループを回す場合は下記のように for を2回使ってループを回す がインデントが上がってしまうので面倒だと思い foreach 一度でループできるようにしてみました for (var x = 0; x < hogeX; x++) { for (var y = 0; y < hogeY; y++) { } } usin…

【Unity】transform.position にアクセスした際の GC を見る

Unity では 以下のような拡張メソッドを利用して Transform の位置を変更することがあるが これを何度か呼んだ場合 GC がどうなってるかを調べる public static class TransformExtension { public static void SetPositionY(this Transform self, float val…

【C#】クラスを拡張する

static class に public static void Test(this Hoge) と記述すると既存のクラスの拡張メソッドを作成することができる 例えば string クラスの 拡張メソッドを作りたい場合は以下のように記述する public static class StringExtension { public static boo…

【C#】Enumerable で利用できる static メソッド

C#

Enumerable.Range public static IEnumerable<int> Range (int start, int count); for のように a ~ b までの値のリストを作成する 1 ~ 10 までのリストができる IEnumerable<int> enumerable = Enumerable.Range(1, 10); Enumerable.Repeat public static IEnumerable<int></int></int></int>…

【C#】Linq で利用できるメソッド一覧

https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.defaultifempty?view=netcore-3.1 上記からよく使いそうなメソッドをまとめました Any All Append Average Cast Concat Contains Count Where First FirstOrDefault GroupBy Last LastO…

【C#】List の初期サイズを指定した場合と指定しなかった場合

new List<T>(1) のように List のインスタンス生成時に 要素数を指定すると 予め 領域を確保することができるため突然のGC を防ぐことができる 初期化のタイミングだと空の場合は 40B 指定した場合は 76 + サイズ * 4B (int の場合) 指定したサイズに満たない場</t>…

【Unity】boxing の GC を見る

boxing 時にはゴミが出るから使わないほうがいいと聞いたが 実際には調べたことがなかったので調査してみました ボクシングについては下記サイトに記述されていますので参考にしてください ボックス化 - C# によるプログラミング入門 | ++C++; // 未確認飛行…

【C#】ToList の GC を見る

Primitive なぜか short だけはこのルールじゃなかったので謎でした 型 サイズ バイト int 0 40 int 1 76 int 2 80 short 0 120 short 1 154 short 2 156 float 0 40 float 1 76 float 2 80 uint 0 40 uint 1 76 uint 2 80 Class 変数1 変数2 サイズ バイト …

【C#】ToArray の GC を見る

Primitive型 int 型のからリストを ToArray してみてGCを見てみる var list = new List<int>(); // 32B list.ToArray(); 次に 1要素だけ入れて見てみる var list = new List<int>(){0}; // 36B list.ToArray(); 36B になった int 型が 4B なのでおそらく要素分だけゴミ</int></int>…

【Unity】GameObject の Hierarchy 上での移動コスト

何度も計測しているわけではないのと階層の違いで速度は違うと思います parent に直接値を入れる以外は何度も利用するわけじゃなければ 使っても問題なさそう Transform.parent Transform.SetParent Transform.SetSiblingIndex Transform.SetAsFirstSibling …

【Unity】自分以下の Graphic 継承の色を一括で変更する

CanvasGroup のように Graphic のColor を書き換えずに 一括で色変更をしてみようと CanvasGroup のコードをみたところ ネイティブの処理で記述されているらしく同じようなものはできなかったので とりあえず無理やり作ってみましたが微妙なやつです using S…

【Unity】Scene 上に Image の UV と 頂点カラー を表示する

通常の画像 9Sliceのある画像 using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEditor; using UnityEngine; using UnityEngine.UI; namespace Yorozu.EditorTool { public class EditorImageDrawer { private st…

【C#7】switch で 条件式を利用する

C# 7

C#7 から switch で when を利用できるようになりました これを利用することで switch の case に 条件式を埋め込めます switch (chr) { // アルファベットかどうか case var c when c >= 'A' && c <= 'z': break; // 数字かどうか case var c when c >= '0'…

【Unity】UnityEngine.CustomYieldInstruction の GC

気になったので計測 WaitUntil と WaitWhile は white() に置き換えたほうがいいかもしれない WaitForSeconds 20 B WaitUntil 136 B WaitWhile 136 B WaitForFixedUpdate 16 B WaitForSecondsRealtime 24 B WaitForEndOfFrame 16 B

【Unity】Material にパラメータをセットする際の速度計測

Material に パラメータをセットする際には Material.SetColor や Material.SetVector などを利用する この際に第一引数には string と int を指定することができる string の場合でも 結局 int に変換されるのですが、この変換処理が遅いらしいので調べてみ…

【Unity】uGUI の自動レイアウト ~テキストサイズに応じたウィンドウ~

下のようなテキストのサイズに合わせてフレームを自動的に変える場合は uGUI の自動レイアウトを利用すると手軽にできる これを作成するには2つのGameObjectが必要で、下図のような親子関係にする 親のGameObject はこのように設定する RectTransformのサイ…

【Unity】Shader で三角関数の値をテクスチャから読み込む

三角関数はもっと遅い - Vitalabolove 店長の雑記帳 上記のサイトを見ていただければ分かるように 三角関数 の計算は遅い なので Shader で利用する際には使いすぎないように注意しようと言われている だから テクスチャ の rgb に sin, cos, tan の結果を書…

【Unity】Shader を利用して Sprite Animation をする

画像はこちらのを利用させていただく Lightning Bolt Effect for Unity | Particles/Effects | Unity Asset Store 縦横の分割数と、1枚あたりの時間を指定して利用する そうするとこのように Shader で SpriteAnimation ができます Shader "Unlit/SpriteAnim…

【Unity】輪郭 Shader を作る

ddx と ddy を利用して輪郭が取得できるかのテストを兼ねて作成してみました 画像は以下のサイトから利用させていただいています [無料写真] 空に浮かぶ風船 - パブリックドメインQ:著作権フリー画像素材集 輪郭 色の差分が少ないところは灰色になってるの…

【Unity】Built-in Shader を確認する

Unity - Download Archive より、見たい Version の ダウンロードをクリックするとBuilt-in Shader を DLすることができる Unity 公式の Github にあると便利なんだけども