-
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 と表示されました
-
そして この経験値のフィールドで
-
値を変更していくと
-
自動的にレベルの値も変更されていきます
-
このようにスクリプト向けにエディターを
-
カスタマイズすると 手動では面倒くさい
-
さまざまな事柄が自動化できるわけです