[System.Serializable]對象放在數組中,默認在Inspector面板上Array的數量是0,如果在這里修改數量,新加的元素在Inspector面板上它是沒有默認值的。
比如:我有一個很輕量級的控件,代碼中需要序列化List數據,沒必要在寫個類OnInspectorGUI中自定義繪制它。使用者會在Inspector面板中決定序列化的數量,可是使用者并不知道要填寫什么樣的值進去, 如果int都是默認值是0 bool默認值是false 可能下面就會有問題。
再具體舉個例子,比如我需要序列化一個模型的縮放scale系數,int 的默認值是0。使用者第一個添加了元素(他并不知道這里需要填1)放到游戲里模型就不顯示了,因為scale是0 坑吧~
今天我無意間發現一個方法也算半完美解決了這個問題。如下代碼所示,聲明Array或者List的時候強制設置添加一個元素進去。(代碼很簡潔)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
public Data[] data1= new Data[1];
public List<Data> data2 = new List<Data> (){ new Data () };
}
[System.Serializable]
public class Data
{
public int a =500;
public bool b = true;
public Data1 subData;
}
[System.Serializable]
public class Data1
{
public int c = 300;
public bool d = false;
}
如下圖所示,當把腳本掛在gameObject上的時候,第一個元素對象就自動加上了默認值。
如下代碼所示,如果按照老的方式來做,不去默認添加一個新元素。
public class Test : MonoBehaviour
{
public Data[] data1;
public List<Data> data2;
}
如下圖所示,修改了List數量后[System.Serializable] 在Inspector面板上就不會出現默認值了。。
最后,上面我說過這個方法只是半完美。原因就是在Inspector面板上修改Array的數量的時候,Unity會自動把元素的值copy給新的元素。所以說如果數量變化,新的元素的默認值會是上一個元素的值。(我覺得這也不影響,因為使用者更關心第一次輸入的默認值是否正確)