You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实例化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:43:27