Unity自身的序列化,会有比较多的限制,例如Dictionary字典,是无法序列化,无法在面板修改存储的,就算使用Odin的ShowInInspector标签,把字典显示出来,也还是无法存储修改的

对应脚本:

新增

保存修改,切换场景,再换回来,修改就失效了,没存下来

这时候,最简单的用法,是可以使用Odin本身的序列化,替代Unity自身的序列化,也就是SerializedMonoBehaviour,替代MonoBehaviour即可; 脚本入口,继承自SerializedMonoBehaviour,实例化的Dictionary,默认就使用了Odin的序列化

Class类被标记Serializable后,就算字典加了OdinSerialize标签,也还是无法被Odin序列化的

而这个MyClassByOdin,虽然加了Serializable

但是调用的时候,强制使用OdinSerialize标签,也还是可以被Odin序列化的

各自表现,可以看到,myUnityReference是没有被序列化出来,其他俩是正常序列化;

测试添加; 保存修改,切换场景之后,还是正常保存下来的

如果不继承自SerializedMonoBehaviour,也想使用Odin序列化,也是可以的,除了继承自MonoBehaviour之外,还继承自ISerializationCallbackReceiver即可; 自定义序列化的这部分,是固定写法

这里声明实例化的字典

正常实例化和修改保存的

Odin还可以用于,序列化,存储游戏数据,优势在于,速度快GC小,而一般使用的Json存储加载,会慢比较多;

各个格式存储方案,性能数据对比

这是功能的逻辑入口;

需要存储加载的,数据结构,三个字典容器,对应字符串、浮点数、整型

通过Odin序列化,保存和加载的函数,SaveData和LoadData

Odin自带的序列化检查工具 Serialization Debugger,入口

例如这个测试脚本,有各种对应,序列化声明

点击,检索出来,就可以看到,其中包含的,所有序列化声明了;

点击,选中,也就会显示出,这个序列化,存在的问题

对应脚本声明,确实存在问题

Odin自带一个,快速调用静态函数的Odin Static Inspector工具,入口

测试脚本,整了一些静态枚举,和按钮功能

点击,输入类名,就可以检索出来了; 表现,显示正常;

点击,功能正常

也可以设置,条件筛选