Unity含枚举类型的自定义类列表序列化异常求助
问题概述
在Unity Inspector中序列化包含PlayerOptionType枚举的自定义类列表时,添加类实例后列表从Inspector消失,控制台循环输出NullReferenceException,首次抛出错误为:
NullReferenceException: SerializedObject of SerializedProperty has been Disposed.
相同代码在新Unity项目中可正常运行,当前项目存在额外因素导致序列化失败,已尝试公开字段、添加无参构造函数、设置枚举默认值、给枚举添加[Serializable]标签等方法,均未解决问题。
排查步骤
检查自定义Editor/PropertyDrawer脚本
若项目中存在针对PlayerOption类或其基类(Base/ItemBase)的自定义Editor脚本、PropertyDrawer,大概率是这类脚本在处理序列化属性时逻辑错误,比如提前释放SerializedObject、未对空属性做判空处理。可暂时禁用这些自定义脚本,验证是否恢复正常。清理Unity序列化缓存
关闭Unity,删除项目根目录下的Library文件夹,重新启动项目让Unity重新生成序列化缓存。旧缓存的残留数据可能引发序列化逻辑冲突。排查序列化冲突项
- 检查是否存在同名类/同名枚举(包括不同命名空间但Inspector识别冲突的情况)
- 确认
PlayerOption类及父类中无无法序列化的字段:比如接口实例、未标记[Serializable]的嵌套类、误用[NonSerialized]标签的需要序列化字段
验证场景/预制体完整性
若问题出在特定场景或预制体,创建新的空GameObject并挂载包含该列表的组件,测试是否能正常序列化。若新对象正常,说明原场景/预制体的序列化数据损坏,需重新创建对象并迁移数据。检查Unity版本兼容性
确认当前项目与测试用新项目的Unity版本是否一致,部分Unity版本存在特定序列化Bug,可尝试升级/降级至稳定版本测试。排查第三方插件干扰
暂时禁用项目中的第三方插件(尤其是涉及序列化、Inspector扩展的插件),逐一排查是否为插件导致的序列化冲突。
内容的提问来源于stack exchange,提问作者Istalri Skolir

