環境
この記事ではUnity5.3.2f1を使用しています。
前書き
何かしらInspector上で表示させたい値があるけど対象のクラス毎に専用のCustomEditorを書くのも億劫だったので極力楽に実現できる手段を調べました。
手順
MonoBehaviorを拡張する
MonoBehaviorを継承するクラスを作成し、表示データ取得用のメソッドを追加する。
クラス名はCustomMonoBehaviorとしておく。
CustomMonoBehaviour.cs
using UnityEngine;
public abstract class CustomMonoBehaviour : MonoBehaviour {
public abstract string GetCustomInspectData();
}
CustomMonoBehaviorを対象とするEditorクラスを作成する
CustomEditor属性の第二引数をtrueにすると、CustomMonoBehaviorを継承するクラスも対象となる。
クラス名はCustomMonoBehaviourInspctorとしておく。
※このスクリプトはEditorフォルダ内に配置すること。でないとビルド出力時にエラーが発生する。
CustomMonoBehaviourInspctor.cs
using UnityEditor;
[CustomEditor(typeof(CustomMonoBehaviour), true)]
public class CustomMonoBehaviourInspctor : Editor {
public override void OnInspectorGUI() {
DrawDefaultInspector(); // デフォルトの表示内容
EditorGUILayout.TextArea((target as CustomMonoBehaviour).GetCustomInspectData()); // 追加表示分
}
}
任意のスクリプトにCustomMonoBehaviorを適用する
CustomMonoBehaviourを継承し、GetCustomInspectDataを表示させたいデータを出力するよう実装する。
クラス名はHogeScriptとしておく。
HogeScript.cs
public class HogeScript : CustomMonoBehaviour {
public override string GetCustomInspectData() {
return transform.position.ToString();
}
}
結果
下図のようにinspector上でのHogeScriptの表示内容が追加される。
あとがき
- クラスを拡張するよりインタフェースを使ったほうが便利じゃね? と思いましたが
CustomEditorでインタフェースを対象にしてもOnInspectorGUIが動かないのでダメでした。 - 単純な文字列や数値を表示したいだけならpublic変数に値を突っ込んでおいた方が楽です。(汚いけど)