obsidian/笔记文件/2.笔记/odin入门和进阶_第六章.md
2025-03-26 00:02:56 +08:00

3.4 KiB
Raw Blame History

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