Unity自身的序列化,会有比较多的限制,例如Dictionary字典,是无法序列化,无法在面板修改存储的,就算使用Odin的ShowInInspector标签,把字典显示出来,也还是无法存储修改的
![[Pasted image 20240319133939.png]]
对应脚本:
![[Pasted image 20240319133958.png]]
新增
![[Pasted image 20240319134014.png]]
保存修改,切换场景,再换回来,修改就失效了,没存下来
![[Pasted image 20240319134100.png]]
这时候,最简单的用法,是可以使用Odin本身的序列化,替代Unity自身的序列化,也就是SerializedMonoBehaviour,替代MonoBehaviour即可; 脚本入口,继承自SerializedMonoBehaviour,实例化的Dictionary,默认就使用了Odin的序列化
![[Pasted image 20240319140646.png]]
Class类被标记Serializable后,就算字典加了OdinSerialize标签,也还是无法被Odin序列化的
![[Pasted image 20240319140804.png]]
![[Pasted image 20240319141010.png]]
而这个MyClassByOdin,虽然加了Serializable
![[Pasted image 20240319141024.png]]
但是调用的时候,强制使用OdinSerialize标签,也还是可以被Odin序列化的
![[Pasted image 20240319141047.png]]
各自表现,可以看到,myUnityReference是没有被序列化出来,其他俩是正常序列化;
![[Pasted image 20240319141122.png]]
测试添加; 保存修改,切换场景之后,还是正常保存下来的
![[Pasted image 20240319141303.png]]
如果不继承自SerializedMonoBehaviour,也想使用Odin序列化,也是可以的,除了继承自MonoBehaviour之外,还继承自ISerializationCallbackReceiver即可; 自定义序列化的这部分,是固定写法
![[Pasted image 20240319141702.png]]
这里声明实例化的字典
![[Pasted image 20240319141734.png]]
正常实例化和修改保存的
![[Pasted image 20240319141743.png]]
Odin还可以用于,序列化,存储游戏数据,优势在于,速度快GC小,而一般使用的Json存储加载,会慢比较多;
各个格式存储方案,性能数据对比
![[Pasted image 20240319142251.png]]
![[Pasted image 20240319142318.png]]
这是功能的逻辑入口;
![[Pasted image 20240319142243.png]]
需要存储加载的,数据结构,三个字典容器,对应字符串、浮点数、整型
![[Pasted image 20240319142416.png]]
通过Odin序列化,保存和加载的函数,SaveData和LoadData
![[Pasted image 20240319142452.png]]
Odin自带的序列化检查工具 Serialization Debugger,入口
![[Pasted image 20240319143132.png]]
例如这个测试脚本,有各种对应,序列化声明
![[Pasted image 20240319143152.png]]
点击,检索出来,就可以看到,其中包含的,所有序列化声明了;
![[Pasted image 20240319143230.png]]
点击,选中,也就会显示出,这个序列化,存在的问题
![[Pasted image 20240319143303.png]]
对应脚本声明,确实存在问题
![[Pasted image 20240319143335.png]]
Odin自带一个,快速调用静态函数的Odin Static Inspector工具,入口
![[Pasted image 20240319143409.png]]
测试脚本,整了一些静态枚举,和按钮功能
![[Pasted image 20240319143459.png]]
点击,输入类名,就可以检索出来了; 表现,显示正常;
![[Pasted image 20240319143609.png]]
点击,功能正常
![[Pasted image 20240319143640.png]]
也可以设置,条件筛选
![[Pasted image 20240319143745.png]]