パハットノート

主にUnity(C#)を中心としたプログラムの備忘録

Unity エディタ拡張 その1(publicでない変数をIntFieldで表示)

導入

例えば、次のクラス「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のままのほうが良いのかもしれません。