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]]