Unity-內(nèi)置序列化
Unity 的一些內(nèi)置功能自動使用序列化技術(shù)。這些功能如下所述。
請參閱有關(guān)腳本序列化的文檔以了解更多信息。
保存和加載
Unity 使用序列化技術(shù)從計算機(jī)的硬盤驅(qū)動器加載和保存場景、資源和?AssetBundle。這包括保存在您自己的腳本 API 對象(如?MonoBehaviour?組件和?ScriptableObject)中的數(shù)據(jù)。
這發(fā)生在 Editor 的 Play 模式和 Edit 模式中。
Inspector 窗口
在?Inspector 窗口中查看或更改游戲?qū)ο蟮慕M件字段的值時,Unity 會序列化此數(shù)據(jù),然后在 Inspector 窗口中顯示數(shù)據(jù)。Inspector 窗口在顯示字段值時不與 Unity Scripting API 通信。如果在腳本中使用屬性,則在 Inspector 窗口中查看或更改值時,絕不會調(diào)用任何屬性 getter 和 setter,因為 Unity 會直接序列化 Inspector 窗口字段。
在 Unity Editor 中重新加載腳本
更改并保存腳本時,Unity 會重新加載所有當(dāng)前加載的腳本數(shù)據(jù)。它首先將所有可序列化變量存儲在所有加載的腳本中,并在加載腳本后恢復(fù)它們。重新加載腳本后,所有不可序列化的數(shù)據(jù)都將丟失。
這會影響所有 Editor 窗口以及項目中的所有 MonoBehaviour。與 Unity 中的其他序列化情況不同,私有字段在重新加載時會默認(rèn)序列化,即使它們沒有“SerializeField”屬性也是如此。
預(yù)制件
在序列化背景下,預(yù)制件是一個或多個游戲?qū)ο蠛徒M件的序列化的數(shù)據(jù)。預(yù)制件實例包含對預(yù)制件源及其一系列修改的引用。這些修改是 Unity 為了創(chuàng)建特定預(yù)制件實例而需要對預(yù)制件源進(jìn)行的操作。
只有在 Unity Editor 中編輯項目時,預(yù)制件實例才存在。在項目構(gòu)建期間,Unity Editor 從兩組序列化數(shù)據(jù)(預(yù)制件源和預(yù)制件實例的修改)進(jìn)行游戲?qū)ο蟮膶嵗?/p>
實例化
對場景中存在的任何對象(例如預(yù)制件或游戲?qū)ο螅┱{(diào)用?Instantiate?時,Unity 都會對其進(jìn)行序列化。在運(yùn)行時和在 Editor 中都是如此。從?UnityEngine.Object?派生的一切均可序列化。
Unity 隨后創(chuàng)建一個新的游戲?qū)ο蟛?shù)據(jù)反序列化到新的游戲?qū)ο笊?。接下來,Unity 在另一個不同的變體中運(yùn)行相同的序列化代碼,以報告正在引用的其他?UnityEngine.Objects
。它會檢查所有引用的?UnityEngine.Objects
?以查看它們是否是要實例化的數(shù)據(jù)的一部分。如果引用指向“外部”,例如紋理,則 Unity 會保持該引用不變。如果引用指向“內(nèi)部”,例如子游戲?qū)ο?,則 Unity 會修補(bǔ)對相應(yīng)副本的引用。
卸載未使用的資源
Resource.GarbageCollectSharedAssets()
?是本機(jī) Unity 垃圾回收器,與標(biāo)準(zhǔn) C# 垃圾回收器執(zhí)行不同的功能。該垃圾回收器在您加載場景之后運(yùn)行,檢查不再引用的對象(如紋理),并安全卸載它們。本機(jī) Unity 垃圾回收器在一個變體中運(yùn)行序列化程序,而在此變體中,對象會報告對外部?UnityEngine.Objects
?的所有引用。通過此方式即可將一個場景使用過的紋理在下一個場景中卸載。