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

Unity中ScriptableObject无法保存System.Object类型列表问题求助

问题:Unity中ScriptableObject无法保存System.Object类型列表

首先是GameData的代码:

public class GameData : ScriptableObject
{
    public List<Group> groups = new List<Group>();
    public List<PostPrefab> prefabs = new List<PostPrefab>();
    public List<Thematic> thematics = new List<Thematic>();
    public List<Task> tasks = new List<Task>();
    public List<object> test = new List<object>(); // 更新代码后无法保存
}

问题描述:
在Unity中,ScriptableObject无法保存System.Object类型的列表。通过Unity编辑器修改该列表后,更新代码,ScriptableObject中的该列表会重置为默认值,但其他所有类型的列表都能正常保存。

编辑器中保存修改的代码:

sobj.Update();
if (GUI.changed)
{
    EditorUtility.SetDirty(obj);
    sobj.ApplyModifiedProperties(); 
    EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene());
}

已尝试给该列表添加[SerializeField]标签,但没有效果。


解决方案

原因

Unity的序列化系统不支持直接序列化System.Object类型。因为Object是所有类型的基类,Unity无法确定列表中具体要序列化的子类型,所以不会对这类数据进行持久化存储。

解决步骤

  1. 替换为具体的可序列化基类列表
    创建一个自定义的可序列化基类,让所有需要存储的类型都继承这个基类,然后用该基类的列表替代List<object>。示例如下:

    // 基类必须添加[Serializable]标签
    [Serializable]
    public class BaseDataItem
    {
        // 可添加通用属性,如ID、类型标识等
        public string itemType;
    }
    
    // 自定义的数据类型,继承基类
    [Serializable]
    public class CustomDataA : BaseDataItem
    {
        public int valueA;
    }
    
    [Serializable]
    public class CustomDataB : BaseDataItem
    {
        public string valueB;
    }
    
    // 修改GameData中的列表类型
    public class GameData : ScriptableObject
    {
        public List<Group> groups = new List<Group>();
        public List<PostPrefab> prefabs = new List<PostPrefab>();
        public List<Thematic> thematics = new List<Thematic>();
        public List<Task> tasks = new List<Task>();
        public List<BaseDataItem> test = new List<BaseDataItem>(); // 现在可正常序列化保存
    }
    
  2. 确保所有自定义类都可序列化
    你的Group、PostPrefab等自定义类,必须添加[Serializable]标签,否则Unity也无法对它们进行序列化。

  3. 优化编辑器保存代码
    ScriptableObject是独立的资源文件,不需要标记场景为脏。简化后的保存代码如下:

    sobj.Update();
    if (GUI.changed)
    {
        EditorUtility.SetDirty(obj);
        sobj.ApplyModifiedProperties();
        AssetDatabase.SaveAssets(); // 可选,确保资源立即保存到磁盘
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:10:17