[Unity] 自前のクラスをインスペクタから編集できるようにする
Unityではスクリプトで定義したクラスのフィールドをPublicにするか[SerializeField]属性を頭に付けることでインスペクタから編集できるようになります。
しかし、自前で定義した構造体やクラスは上記のことをやってもインスペクタ上には表示されません。
たとえば以下のようなスクリプトをゲームオブジェクトにアタッチした場合、インスペクタ上では何も表示されません。
using UnityEngine; using System.Collections; using System.Collections.Generic; public class Test : MonoBehaviour { // 自前の頂点クラス class MyPoint { public float x, y, z; }; [SerializeField] MyPoint myPosition; }
独自で定義した構造体のフィールドはインスペクタから参照できないので諦めるしかないですが、クラスは参照させることができます。
クラスの前に[System.Serializable]属性をつけます。
using UnityEngine; using System.Collections; using System.Collections.Generic; public class Test : MonoBehaviour { // 自前の頂点クラス [System.Serializable] class MyPoint { public float x, y, z; }; [SerializeField] MyPoint myPosition; }
これでめでたしめでたし・・・かと思いきや、以下のようにテンプレート引数を持つジェネリッククラスでは[System.Serializable]属性をつけてもインスペクタに表示されません。
using UnityEngine; using System.Collections; using System.Collections.Generic; public class Test : MonoBehaviour { // 自前の頂点クラス [System.Serializable] class MyPoint<t> { public T x, y, z; }; [SerializeField] MyPoint<double> myPosition; }
どうしてもインスペクタに表示させたい場合は、ジェネリッククラスからジェネリックではないサブクラスを作って使うしか無いようです。
using UnityEngine; using System.Collections; using System.Collections.Generic; public class Test : MonoBehaviour { // 自前の頂点クラス class MyPoint<t> { public T x, y, z; }; [System.Serializable] class MyPointDouble : MyPoint<double> {}; [SerializeField] MyPointDouble myPosition; }
ジェネリッククラスもインスペクタから参照できるようになってほしいですが、これは今後のバージョンアップに期待することとしましょう。
■参考サイト
Unity – Scripting API: Serializable
UnityのInspectorで変数を表示する方法まとめ – Qiita
C#で構造体をInspectorで使える様にする方法 – 強火で進め
[Unity]ジェネリッククラスをInspectorに表示するにはどうすればいいの? | ケットシーウェア