Scriptable Object在项目窗口循环操作后无法保存的问题求助
问题分析与解决方案
Scriptable Object数据丢失的核心原因
Scriptable Object作为项目资源存储,Editor模式下修改后若未正确标记脏数据并触发保存,当项目窗口刷新、资源重新导入(即你说的“循环操作”)时,Unity会重新加载原始资源,导致未保存的修改丢失。而重启Unity时自动触发了资源保存流程,所以数据能保留。关键修复操作
- 修改后标记脏数据并主动保存
在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 } - 避免直接修改原始资源(可选优化)
若只是Editor测试用数据,建议创建SO的运行时克隆,或者将持久化数据存储到本地文件/PlayerPrefs,而非直接修改项目中的SO资源,防止误操作导致数据丢失。 - 排查资源刷新触发条件
检查“项目窗口循环操作”是否触发了脚本编译、资源重新导入,这类操作会导致Unity重新加载SO资源,未保存的修改会被覆盖。确保每次修改后都执行保存操作。
- 修改后标记脏数据并主动保存
额外验证点
- 确认SO实例是通过
[CreateAssetMenu]创建的项目资源,而非代码中动态生成的内存对象(内存对象无法持久化)。 - 修改后在Project窗口中右键SO选择“Reveal in Explorer”,查看文件修改时间是否更新,确认保存操作生效。
- 确认SO实例是通过
内容的提问来源于stack exchange,提问作者minyoung
相关产品推荐
相关产品推荐

