实例化ScriptableObject后修改值同步影响原对象问题求助
解决ScriptableObject实例化后数值同步变更的问题
问题根源
你代码里的Instantiate(baseData)在Unity编辑器模式下会导致修改被自动保存回原始ScriptableObject资源文件,所以所有引用原SO的地方都会同步变化。另外第一行Data = ScriptableObject.CreateInstance<Item>()完全多余,直接被下一行的赋值覆盖了。
修复方案
方案1:手动深拷贝字段值
创建全新的SO实例,然后把原SO的所有字段值逐一复制过去,确保新实例完全独立:
public Item baseData; public Item Data; public void Awake() { // 创建独立的SO实例 Data = ScriptableObject.CreateInstance<Item>(); // 复制原数据的所有字段 Data.durability = baseData.durability; Data.itemName = baseData.itemName; // 其他自定义字段都需要手动复制 }
方案2:用JsonUtility自动深拷贝
如果字段太多不想手动复制,可以用Unity的JsonUtility实现一键深拷贝:
public Item baseData; public Item Data; public void Awake() { Data = ScriptableObject.CreateInstance<Item>(); // 将原序列化为JSON,再覆盖到新实例 string baseDataJson = JsonUtility.ToJson(baseData); JsonUtility.FromJsonOverwrite(baseDataJson, Data); }
补充说明
- 运行时环境下,用上述方法创建的SO实例是完全独立的,修改数值不会影响原资源或其他实例
- 编辑器模式下测试时,避免直接在检视面板修改新SO的数值(编辑器可能仍会尝试保存),尽量通过代码修改或者在Play Mode下测试
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

