List内の変数をInspectorに表示する方法

 対象のクラスに[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; }
}



コメント