Unity 序列化对象SerializedObject 使用小

2022-07-12  本文已影响0人  暴走TA

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

哪些类可以被 SerializedObject 使用

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

序列化类无法持久化保存

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


类名和文件名没有匹配,系统也会有提示
由于名字不匹配,导致保存过的文件在代码编译后报错误
名字修改一致后
序列化内容也回来了

非基础类型的类,需要添加 [System.Serializable] 标签

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


test类里有一个objTest类字段
ObjTest类的内容
序列化文件并没有 test 字段
ObjTest类加上 [System.Serializable] 标签
加上标签后 ObjTest 类型的资源也被序列化了

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

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


TypeMismatch,使用odin插件时这里会显示为一个文件类型
使用odin的时候可以点击编辑

关于可以被序列化的字段

注意上面说的可以被序列化的类型,这里说的时字段
可序列化的类型内的字段,可以被序列化字段满足以下条件

  1. public 或则 非public 但是添加了[SerializeField]标签的字段
  2. 字段是基础类型 或则 添加了 [System.Serializable] 标签的类型
image.png
image.png
image.png

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

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

猜你喜欢

热点阅读