主要内容
介绍unity常用的与序列化相关的属性,总结一下unity的序列化系统
一、SerializeField
unity在序列化脚本时,它只会序列化公有字段,如果想要序列化私有字段,就需要为该字段添加SerializeField特性,该特性用于强制序列化私有字段;
序列化的目的是为了进行本地存储,unity将会序列化所有的脚本化组件然后从序列化版本中重新创建脚本组件;unity的序列化不是.NET的序列化,而是unity自己内置的序列化系统;
应用规则:
- 可以序列化公有的非静态类型
- 可以序列化非公有非静态的但是标记了SerializeField特性的字段
- 不可以序列化static字段
- 不可以序列化属性
根据以上应用规则,在unity可以进行序列化的类型如下:
- 所有从UnityEngine.Object继承的类
- 所有的基础类型,包括字符串
- 一些内置类型,如Vector2,Vector3,Color等
- 由可序列化类型组成的Array和List
- 结构体和枚举类型
注意:unity中Dictionary类型不可以序列化,但是unity手册内给出了替代方案:可以使用List分别存储key值和value值,然后在Awake()中组成Dictionary类型
二、HideInInspector
将字段在属性面板中隐藏,但是序列化该字段;无论公有字段还是私有字段,都会进行序列化但是隐藏不显示在属性面板中;
三、C#中的NonSerializable与System.Serializble
使用C#的序列化系统完成序列化的一些操作;
四、扩展-Unity Inspector Window的Debug和Normal模式
在属性面板的显示中,默认显示为Normal模式,也可以切换到Debug模式;
- Normal模式,属性面板显示的是一个资源或者组件的自定义编辑器,Inspector的属性编辑窗口是默认窗口(只显示公有字段),而如果为脚本写了CustomEditor,那么Custom Editor里定义了什么控件就会显示什么,而与属性的公有和私有无关;
- Debug模式,显示公有字段和私有字段(私有字段是只读的),注意,如果一个字段设置了HideInspector或者NonSerializable,那么它将不会显示在Inspector的Debug模式中;