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

Scriptable Object在项目窗口循环操作后无法保存的问题求助

问题分析与解决方案
  • Scriptable Object数据丢失的核心原因
    Scriptable Object作为项目资源存储,Editor模式下修改后若未正确标记脏数据并触发保存,当项目窗口刷新、资源重新导入(即你说的“循环操作”)时,Unity会重新加载原始资源,导致未保存的修改丢失。而重启Unity时自动触发了资源保存流程,所以数据能保留。

  • 关键修复操作

    1. 修改后标记脏数据并主动保存
      在Editor模式下修改Scriptable Object内容后,必须调用EditorUtility.SetDirty()标记资源为脏,再调用AssetDatabase.SaveAssets()强制保存。运行时(Build包)无需此操作,因为运行时SO是内存实例,持久化需用其他方式。
      示例代码:
      public void RecordConsumedItem(ConsumableItem item, PlayerDataSO dataSO)
      {
          dataSO.consumedItems.Add(item);
          #if UNITY_EDITOR
          UnityEditor.EditorUtility.SetDirty(dataSO);
          UnityEditor.AssetDatabase.SaveAssets();
          #endif
      }
      
    2. 避免直接修改原始资源(可选优化)
      若只是Editor测试用数据,建议创建SO的运行时克隆,或者将持久化数据存储到本地文件/PlayerPrefs,而非直接修改项目中的SO资源,防止误操作导致数据丢失。
    3. 排查资源刷新触发条件
      检查“项目窗口循环操作”是否触发了脚本编译、资源重新导入,这类操作会导致Unity重新加载SO资源,未保存的修改会被覆盖。确保每次修改后都执行保存操作。
  • 额外验证点

    • 确认SO实例是通过[CreateAssetMenu]创建的项目资源,而非代码中动态生成的内存对象(内存对象无法持久化)。
    • 修改后在Project窗口中右键SO选择“Reveal in Explorer”,查看文件修改时间是否更新,确认保存操作生效。

内容的提问来源于stack exchange,提问作者minyoung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:05:23