美文网首页
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 使用小

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