対象のクラスに[System.Serializable]だけをつけ、MonoBehaviourを継承しないことです。
Copy
using UnityEngine; // System.Serializable がついているとList内なら内部の変数が表示される // (MonoBehaviourがないので単体ではGameObjectにつけられない) [System.Serializable] public class Serializable { // field: をつけるとプロパティでもInspectorで表示されるようになる // 参考 https://waken.hatenablog.com/entry/2022/03/17/151205 [field: SerializeField] public int Num { get; set; } }
Copy
using System.Collections; using System.Collections.Generic; using UnityEngine; public class InspectorSample : MonoBehaviour { // 内部の変数も表示される [SerializeField] private List<Serializable> serializables = new(); // 他への参照となり、内部の変数は表示されない [SerializeField] private List<MonoBehaivorEx> monoBehaivorEx = new(); // エラー [SerializeField] private List<Plane> planes = new(); // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }
この場合、MonoBehaviourを継承してないので単体ではGameObjectにつけられないのが罠ですね・・・
プログラミングって単体で動作確認してから複数のバージョン作るのが基本なのでハマりました・・・
MonoBehaviourを継承すると、他への参照という形になるようで、List内には変数は表示されません。
Copy
using UnityEngine; // MonoBehaviour がついているとリスト内では内部の変数が表示されない // (値は他のGameObjectにアタッチされているはずであり、リスト内は参照だけ) public class MonoBehaivorEx : MonoBehaviour { [field: SerializeField] public int Num { get; set; } // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }
なお、何もつけてないクラスをList内にいれると「NullReferenceException: SerializedObject of SerializedProperty has been Disposed.」が大量にでます。よい子はマネしないこと。
Copy
using UnityEngine; // 何もつけないクラスだと、ListにいれてもInspectorに表示されず、エラーになる // NullReferenceException: SerializedObject of SerializedProperty has been Disposed. // Unity内ですごい勢いエラーが増えるのでマネしないこと public class Plane { [field: SerializeField] public int Num { get; set; } }
コメント
コメントを投稿