運行遊戲,每次 Instantiate(prefab) 生成實例後,修改實例上的數組/列表/自定義類字段,發現 Prefab 資產本身也被修改了。
list.Add(item)、arr[0]=val),實際修改的是共享對象,Prefab 同步「變臟」。var obj = Instantiate(prefab);
obj.GetComponent().path = new List(prefab.path); // 深拷貝列表
ScriptableObject 資產,Prefab 引用同一配置,運行時只讀不改。OnBeforeSerialize 深拷貝,OnAfterDeserialize 恢復。AddComponent 或從資源管理器加載。「Prefab 只存不可變配置;可變狀態在運行時初始化,或使用 ScriptableObject 分離數據與行為。」