Re: [程式] Unity遇到List初始化器就閃退?

作者: elcnick (左手謝謝右手指教)   2019-12-08 14:29:52
首先,你要弄清楚Unity3d的序列化規則
MonoBehaviour能被序列化的欄位(Field)為
1. 宣告為public
2. 帶有標籤[UnityEngine.SerializeField] 但為non public
的欄位
3. 沒有帶標籤[System.NonSerialized]
4. Property預設是無法序列化的
能被序列化的類型為
1. 基礎資料類型,例如int string float 等等
2. 帶有[System.SerializableAttribute]的class或者struct
並且不能有遞迴結構,要不然會跳出錯誤
3. 繼承自UnityEngine.Object,受Unity控管的物件
4. T[]或者List<T> T為能序列化的類型
作為第2種結構,資料儲存方式會是樹狀的
作為第3種結構,會有該物件專屬的id,會是一筆一筆的紀錄
而MonoBehaviour是Unity控管的物件,請不要自行呼叫其建構子
這是必定錯誤的寫法
如果想更清楚明白,其實你可以直接用純文字打開檔案較小的.asset或者場景
其資料類型是yaml,這應該有助於你了解其資料結構
而會閃退的原因應該只是代碼造成無窮遞迴的關係
Visual Studio版本應該也會一樣的情況,如果是沒有印出任何訊息
代表只是要比較久才會發生堆疊溢位
最後,Unity3D,其編輯器預設上可以編輯序列化結構的資料
使用編輯器欄位初始化你的資料,不要在代碼去增加資料
public class MegBox:MonoBehaviour
{
// 在這邊,編輯器是可以直接更改資料內容的
[SerializeField]
private Data[] m_DataList;
void Start()
{
if(m_DataList!=null)
{
//Do something
}
}
}
[System.Serializable]
public class Data
{
public string P;
public int M;
}
作者: berice152233 (WASHI買的zenfone2)   2019-12-09 16:21:00
非常感謝學長的解說正在用你說的方法研究如何改進,謝謝

Links booklink

Contact Us: admin [ a t ] ucptt.com