找回密码
 立即注册
查看: 409|回复: 0

Unity 序列化对象SerializedObject 使用小结

[复制链接]
发表于 2022-7-13 21:30 | 显示全部楼层 |阅读模式
简介: 主要记录一写使用时遇到的问题,例如数据没有持久化保存到文件,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 对象


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


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

关于可以被序列化的字段


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

image.png


image.png


image.png

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 15:40 , Processed in 0.091276 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表