Unity ではカスタムインスペクターを作成して スクリプト中の どのデータを表示するか そしてエディター上でどう表示するかを制御できます エディターを拡張できるということは スクリプトがより強力かつ柔軟に使えるということで ひいてはワークフローの改良にもつながります たとえばレベルアップシステムを作っているとしましょう これは経験値を 750 ポイント獲得すると レベルがひとつ上がるシステムであるとします レベルが低いうちは計算も簡単ですが 高レベルになるにつれてだんだんと 計算がめんどくさくなってきます そこでカスタムインスペクターを 使って この作業を簡単にしてみましょう ここに LevelScript というスクリプトがあります このスクリプトが先ほどの経験値ベースの レベルアップシステムです スクリプトで最初に目に入るのが experience 変数ですね この関数はキャラクターが獲得した 経験値の累計を格納します 次に Level というプロパティがあります このプロパティは 現在の経験値を取り 対応するレベルを返します プロパティの詳細については 下記リンク先にあるプロパティのレッスンをご覧ください さて空っぽのゲームオブジェクトを配置して それに LevelScript をアタッチしてみました Experience(経験値)プロパティがインスペクターに 表示されているのが見えますね 経験値が 0 ならレベルを計算するのも簡単ですが 49865 だったらどうでしょう? ここでインスペクターをカスタマイズして レベルを表示してみましょう インスペクターをカスタマイズするにはまずエディターの スクリプトを格納するフォルダを作成する必要があります Unity に認識させるためこのフォルダの名前は Editor としてください そしてフォルダ内に新規スクリプトを作成します このスクリプトにカスタムインスペクターを含めます 名前は自由に付けられますが 今回は内容に沿って LevelScriptEditor としましょう それではこの LevelScriptEditor に カスタムインスペクターを書いていきます エディター固有のコードを書くときはまず UnityEditor 名前空間を使うことを 宣言しなくてはいけません 名前空間の詳細については 下記リンク先にある名前空間のレッスンをご覧ください 次に継承元を MonoBehaviour から Editor に変更します エディタの拡張は基本的にこうして行います 継承の詳細については 下記リンク先にある継承のレッスンをご覧ください さてここからは カスタムインスペクターに 属性を与えて どのスクリプトを カスタマイズしているのかを示します 構文はまず開き角カッコ 続けて キーワードCustomEditor そしてカッコ カッコの中にはキーワード typeOf で型を指定します そしてその中にさらにカッコの対を作り スクリプトの名前を入力します この例では ご覧のとおり カスタマイズするのは LevelScript です そして行を 閉じ角カッコで締めます 続いて LevelScriptEditor クラスの内部に メソッド public override void OnInspectorGUI を作ります このメソッドはインスペクターが Unity 上で描画される際に 毎回呼び出されます override キーワードの 挙動の詳細については 下記リンク先にあるオーバーライドのレッスンをご覧ください これで LevelScript のインスペクターが 変更されました この状態で Unity に戻ると スクリプトのプロパティがひとつも インスペクタービューに表示されないのがわかります これではぜんぜん便利でないので カスタマイズを進めていきましょう LevelScriptEditor に戻って インスペクターで表示するフィールドを作ってみます OnInspectorGUI メソッドの内部には自動的に LevelScript オブジェクトへの参照である target が含まれます しかしこれは適切な型の変数に キャストするまでは使えません なのでまず myLevelScript という LevelScript 変数を作り 継承した変数 target とイコールでつなぎます そして最後に target 変数を LevelScript 変数としてキャストします これはカッコで囲んだ LevelScript を隣に書いて表現します さてここでインスペクターに表示したい情報は キャラクターの獲得した経験値合計と 現在のレベルの 2 つです インスペクターに int フィールドを作るときは EditorGUILayout クラスを使います 構文は 最初にクラス名 EditorGUILayout 続けて.(ピリオド) そしてメソッド IntField 最後にカッコ カッコの中にはフィールド名と フィールドの値を指定します 今回はフィールド名に Experience(経験値) 値に myLevelScript の experience 変数の値を 指定します このフィールドに experience 変数への書き込みも させたいので 行全体を myLevelScript.experience と イコールでつなぎます Level フィールドもだいたい同じように処理していきます ただし今回は EditorGUILayout クラスの LabelField メソッドを使います ラベルは読み取り専用なので ユーザーがインスペクター上でレベルを 手動入力してしまうことは起きません LabelField メソッドのカッコ内には Level という名前と 値 myLevelScript.Level を指定します ただしラベルのコントロールは文字列である必要があるので ここで Level プロパティに対して ToString メソッドを使い 文字列に変換します これでカスタムインスペクターは完成です さっそく Unity に戻って確認してみましょう ご覧のとおり インスペクターには 経験値が 49865 のとき レベルは 66 と表示されました そして この経験値のフィールドで 値を変更していくと 自動的にレベルの値も変更されていきます このようにスクリプト向けにエディターを カスタマイズすると 手動では面倒くさい さまざまな事柄が自動化できるわけです