maimai_jp's blog

twitterでは書ききれないことなどをこちらに。

propとEditor拡張

先週末からずーーーーーーーーーっと、とある挙動に悩まされてまして。
それが解決したので備忘録として残しておきます。

Editor拡張でパラメータを表示させる際、以下のようなget/setを設定したpropも普通に使える……と思いきや、実は若干問題が発生します。

private int _hoge;
[SerializeField]
public int hoge
{
    get { return _hoge; }
    set { _hoge = value;}
}

自分の場合に発生したのは、自作enumを使おうとした場合のこと。
なぜかrunした際や再起動した際に、「値が必ず0に設定されてしまう」という現象でした。

//MyClass
public enum MyEnum
{
    val1= 1,
    val2= 2,
    val3= 3
}

private MyEnum _hoge;
[SerializeField]
public MyEnum hoge
{
    get { return _hoge; }
    set { _hoge = value;}
}
//MyClass Editor
public override void OnInspectorGUI()
{
    MyClass mc = target as MyClass;
    MyClass.MyEnum m = (MyClass.MyEnum)EditorGUILayout.EnumPopup("MyEnum", mc.hoge);
    if(mc.hoge != m){
        mc.hoge= m;
    }
}

⇒runした際にhogeの値が0になる
⇒インスペクタ上の"MyEnum"が空欄になる(0に該当するMyEnum値がないので)

解決方法はいたって簡単、get/setの使用をやめること。
Editor拡張で使用する値はpublicなプロパティのみ使用する。

たぶんもっといい解決方法はあるんでしょうけど、まあEditor拡張というappendixな機能ですし簡単に解決すべきかと。

(考えてみれば、publicなプロパティを表示するのがInspectorなので、そもそもprivateな値は表示させるような仕様にはなってないという説)