首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Unity Prefab 實例化後數據被修改的常見原因:引用類型共享與序列化機制深度解析

     編輯:程式設計疑難解答

現象

運行遊戲,每次 Instantiate(prefab) 生成實例後,修改實例上的數組/列表/自定義類字段,發現 Prefab 資產本身也被修改了。

根本原因:淺拷貝共享引用類型

  • Prefab 是模板,實例化時對值類型(int、float、Vector3、結構體)進行深拷貝。
  • 對引用類型(數組、List、自定義 Class、Material、Texture)僅拷貝引用,實例與 Prefab 指向同一堆內存對象。
  • 修改實例的引用類型字段內容(如 list.Add(item)、arr[0]=val),實際修改的是共享對象,Prefab 同步「變臟」。

解決方案

  1. 實例化後重新賦值(最簡單):
    var obj = Instantiate(prefab);
    obj.GetComponent().path = new List(prefab.path); // 深拷貝列表
  2. 使用 ScriptableObject 存放共享數據:將配置數據剝離到 ScriptableObject 資產,Prefab 引用同一配置,運行時只讀不改。
  3. 實現 ISerializationCallbackReceiver 自定義序列化:在 OnBeforeSerialize 深拷貝,OnAfterDeserialize 恢復。
  4. 避免在 Prefab 上直接掛載可變引用類型字段:改為運行時 AddComponent 或從資源管理器加載。

最佳實踐

「Prefab 只存不可變配置;可變狀態在運行時初始化,或使用 ScriptableObject 分離數據與行為。」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved