美文网首页
Unity 序列化对象SerializedObject 使用小

Unity 序列化对象SerializedObject 使用小

作者: 暴走TA | 来源:发表于2022-07-12 18:41 被阅读0次

简介: 主要记录一写使用时遇到的问题,例如数据没有持久化保存到文件,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 类,也就是上面不建议嵌套的一个原因

相关文章

  • Unity 序列化对象SerializedObject 使用小

    简介: 主要记录一写使用时遇到的问题,例如数据没有持久化保存到文件,SerializedObject 创建失败,...

  • C#序列化

    序列化操作 序列化对象声明 对类使用序列化时,标注那些不需要序列化的字段。 序列化只能针对字段使用。 使用序列化相...

  • Unity中的序列化与反序列化

    Unity的数据存储,本地类 PlayerPrefs, Inspector,以及Prefab等都使用了序列化与反序...

  • Unity&C#序列化与反序列化

    Unity与C#的序列化与反序列化

  • 20 对象序列化/反序列化

    1 对象序列化/反序列化简介 在实际开发中,为了简化开发,通常请求和响应都使用使用Java对象表示,对使用者屏蔽底...

  • Java序列化

    含义、意义使用场景 序列化:将对象写入到IO流中 反序列化:从IO流中恢复对象 意义:序列化机制允许将实现序列化的...

  • Go学习笔记(五)

    I/O小练习 字符串练习 XML编码处理 struct对象的序列化和反序列化: 使用os.Args获取简单参数 G...

  • JAVA I/O 输入输出流

    编码问题 File类的使用 RandomAccessFile类的使用 字节流 字符流 对象的序列化与反序列化

  • Unity xml序列化和反序列化

    xml序列化 也就是将一个类序列化本地数据,例如以下类: 实际使用测试,将类转化为xml: (刷新unity,缩小...

  • 内存优化记录1

    1:概念熟知与工具使用 profiler的使用,数据类型的区别,对象池的艺术.unity管理内存,A)unity引...

网友评论

      本文标题:Unity 序列化对象SerializedObject 使用小

      本文链接:https://www.haomeiwen.com/subject/osjtirtx.html