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な値は表示させるような仕様にはなってないという説)