NoiseFloor 发表于 2022-7-13 21:30

Unity 序列化对象SerializedObject 使用小结


简介: 主要记录一写使用时遇到的问题,例如数据没有持久化保存到文件,SerializedObject创建失败,找不到子属性等
版本: Unity2019.4.28f1
哪些类可以被 SerializedObject使用


SerializedObject类的构造函数显示传入 UnityEngine.Object 对象就可以创建,但是使用时发现自己直接继承自 UnityEngine.Object的类会创建失败,内置的几个类可以正常使用   MonoBehaviour ,ScriptableObject , Editor ,EditorWindow,而一般情况下需要序列化的类我会继承 ScriptableObject 。
序列化类无法持久化保存


序列化文件的保存创建没有问题,但是当工程重新编译脚本时,也就是我们修改了脚本并保存后,会发现保存的序列化文件报错,内容全无。
这个造成这个问题的原因是,我们的序列化类的类名和他的文件名不一致导致的,虽然第一次创建保存都没问题,但是当编译后,引擎就找不到类了,所以会提示需要修复边伊错误


类名和文件名没有匹配,系统也会有提示


由于名字不匹配,导致保存过的文件在代码编译后报错误


名字修改一致后


序列化内容也回来了

非基础类型的类,需要添加 标签


自定义类型的字段要想被序列化保存下来 需要给自定义类型添加 标签


test类里有一个objTest类字段


ObjTest类的内容


序列化文件并没有 test 字段


ObjTest类加上 标签


加上标签后 ObjTest 类型的资源也被序列化了

自定义类型字段的类 如果也继承自 ScriptableObject


这里不考虑自定义的界面显示
自定义类型字段的类 如果也继承自 ScriptableObject,则这个类型不需要添加 标签,但是显示的状态是一个 TypeMismatch ,使用odin 会是一个文件类型,并且点击后可以编辑
所以尽量不要嵌套 ScriptableObject 对象


TypeMismatch,使用odin插件时这里会显示为一个文件类型


使用odin的时候可以点击编辑

关于可以被序列化的字段


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

image.png


image.png


image.png

关于属性的获取与属性的属性获取

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