Unity 序列化对象SerializedObject 使用小
简介: 主要记录一写使用时遇到的问题,例如数据没有持久化保存到文件,SerializedObject 创建失败,找不到子属性等
版本: Unity2019.4.28f1
哪些类可以被 SerializedObject 使用
SerializedObject 类的构造函数显示传入 UnityEngine.Object 对象就可以创建,但是使用时发现自己直接继承自 UnityEngine.Object 的类会创建失败,内置的几个类可以正常使用 MonoBehaviour ,ScriptableObject , Editor ,EditorWindow,而一般情况下需要序列化的类我会继承 ScriptableObject 。
序列化类无法持久化保存
序列化文件的保存创建没有问题,但是当工程重新编译脚本时,也就是我们修改了脚本并保存后,会发现保存的序列化文件报错,内容全无。
这个造成这个问题的原因是,我们的序列化类的类名和他的文件名不一致导致的,虽然第一次创建保存都没问题,但是当编译后,引擎就找不到类了,所以会提示需要修复边伊错误




非基础类型的类,需要添加 [System.Serializable] 标签
自定义类型的字段要想被序列化保存下来 需要给自定义类型添加 [System.Serializable] 标签





自定义类型字段的类 如果也继承自 ScriptableObject
这里不考虑自定义的界面显示
自定义类型字段的类 如果也继承自 ScriptableObject,则这个类型不需要添加 [System.Serializable] 标签,但是显示的状态是一个 TypeMismatch ,使用odin 会是一个文件类型,并且点击后可以编辑
所以尽量不要嵌套 ScriptableObject 对象,
而且这种对象在实际的序列化对象文件中 只保存了一个fileID, 如果没有保存在 ScriptableObject 为文件,那么下次再开启unity时这个对象就会失效,当前不失效只是因为对象存在与内存当中


关于可以被序列化的字段
注意上面说的可以被序列化的类型,这里说的时字段
可序列化的类型内的字段,可以被序列化字段满足以下条件
- public 或则 非public 但是添加了[SerializeField]标签的字段
- 字段是基础类型 或则 添加了 [System.Serializable] 标签的类型



关于属性的获取与属性的属性获取
- 属性的获取,就是创建一个SerializedObject对象后,使用该对象的 FindProperty 方法便可以找到器内部的序列化属性
- 属性的属性获取,就是在SerializedObject对象获取一个属性 P 后, 在继续获取 P 中的属性,这里就要使用 SerializedProperty 的 FindPropertyRelative 方法,注意 我们获取的P 就是SerializedProperty类型。
这里有一个小问题就是有时我们无法使用 FindPropertyRelative 获取属性的属性
当我们的属性类型继承自 ScriptableObject 时,FindPropertyRelative 无法生效,所以这里的属性类型 要是添加了 [System.Serializable] 的非ScriptableObject 类,也就是上面不建议嵌套的一个原因