Unity-腳本序列化錯(cuò)誤
序列化是將數(shù)據(jù)結(jié)構(gòu)或?qū)ο鬆顟B(tài)轉(zhuǎn)換為 Unity 可存儲(chǔ)并在以后可重構(gòu)的格式的自動(dòng)過(guò)程。(請(qǐng)參閱有關(guān)腳本序列化的文檔以了解更多信息。)
在某些情況下,腳本序列化可能會(huì)導(dǎo)致錯(cuò)誤。下面列出了其中一些錯(cuò)誤的修復(fù)方法。
從構(gòu)造函數(shù)或字段初始化函數(shù)調(diào)用 Unity Scripting API
在?MonoBehaviour?構(gòu)造函數(shù)或字段初始化函數(shù)中調(diào)用諸如?GameObject.Find?之類的腳本 API 會(huì)觸發(fā)錯(cuò)誤:“Find is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call in in Awake or Start instead.”
解決此問題的方法是在?MonoBehaviour.Start?中而不是在構(gòu)造函數(shù)中調(diào)用腳本 API。
在反序列化期間調(diào)用 Unity Scripting API
從標(biāo)有?System.Serializable
?的類的構(gòu)造函數(shù)中調(diào)用諸如?GameObject.Find?之類的腳本 API 會(huì)觸發(fā)錯(cuò)誤:“Find is not allowed to be called during serialization, call it from Awake or Start instead.”
要解決此問題,請(qǐng)編輯代碼,確保不會(huì)在任何序列化對(duì)象的構(gòu)造函數(shù)中調(diào)用任何腳本 API。
線程安全的 Unity Scripting API
大多數(shù)腳本 API 都受上面列出的限制所影響。只有部分 Unity Scripting API 免受影響,可從任何位置接受調(diào)用。它們?nèi)缦拢?/p>
Debug.Log
Mathf?函數(shù)
簡(jiǎn)單的獨(dú)立結(jié)構(gòu);例如,像?Vector3?和?Quaternion?這樣的數(shù)學(xué)結(jié)構(gòu)
為了降低序列化過(guò)程中出錯(cuò)的風(fēng)險(xiǎn),只能調(diào)用不需要在 Unity 本身中獲取或設(shè)置數(shù)據(jù)的獨(dú)立 API 方法。僅在沒有其他選擇的情況下才調(diào)用它們。