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无法确定列表中具体要序列化的子类型,所以不会对这类数据进行持久化存储。
解决步骤
替换为具体的可序列化基类列表
创建一个自定义的可序列化基类,让所有需要存储的类型都继承这个基类,然后用该基类的列表替代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>(); // 现在可正常序列化保存 }确保所有自定义类都可序列化
你的Group、PostPrefab等自定义类,必须添加[Serializable]标签,否则Unity也无法对它们进行序列化。优化编辑器保存代码
ScriptableObject是独立的资源文件,不需要标记场景为脏。简化后的保存代码如下:sobj.Update(); if (GUI.changed) { EditorUtility.SetDirty(obj); sobj.ApplyModifiedProperties(); AssetDatabase.SaveAssets(); // 可选,确保资源立即保存到磁盘 }
内容的提问来源于stack exchange,提问作者NN NN
相关产品推荐
相关产品推荐

