導入
例えば、次のクラス「Monster」があるとします。
public class Monster : MonoBehaviour { public int hp; }
変数"hp"をエディタ拡張でインスペクターに表示するためには、以下のようなクラスを作成する必要がありますが、これは変数"hp"がpublicである場合のみ有効です。
using UnityEditor; [CustomEditor(typeof(Monster))] public class MonsterEditor : Editor { public override void OnInspectorGUI() { var pokemon = target as Monster; pokemon.hp = EditorGUILayout.IntField("体力", pokemon.hp); } }
改善案
serializedObject.FindPropertyを使用すれば、privateな変数でも[SerializeField]をつけることで、インスペクター上に表示できます。
それぞれのクラスは以下のように書き換えられる。
public class Monster : MonoBehaviour { [SerializeField] int hp; }
using UnityEditor; [CustomEditor(typeof(Monster))] public class MonsterEditor : Editor { public override void OnInspectorGUI() { SerializedProperty property = serializedObject.FindProperty("hp"); property.intValue = EditorGUILayout.IntField("体力", property.intValue); serializedObject.ApplyModifiedProperties(); } }
ここで、"MonsterEditor"の
serializedObject.ApplyModifiedProperties();
がないと、書き換えた値が保存されません。
あとがき
目的は達成できましたが、変更後のほうがプログラムが長くなってしまいました・・・
privateであることなどにこだわりがないのであれば、publicのままのほうが良いのかもしれません。