Unity Serialization 序列化

1.Script Serialization

 序列化是unity中把数据结构或者是对象状态转换成unity可以存储的格式的一个自动化过程,一些unity内置的特性就是使用序列化,比如保存和加载,属性面板,实例化,以及prefab

 你在untiy中如何声明你的变量,影响着unity怎么序列化它,同时也对性能有一定的影响

2.什么是热重载

 热重载是在编辑器下创建修改脚本,能够立马生效的过程,不需要重新打开VS或者unity

当你更改脚本变量并保存时,Unity会先存储所有序列化变量,然后再把它们从硬盘上加载出来,赋值给之前序列化的变量,这样就完成了值的更新,那些不能序列化的变量数据就丢失了,因为赋值的是空值

3.保存和加载

Unity 使用序列化从硬盘上加载 Scenes, AssetsAssetBundles t. 这也包括你在脚本中保存的变量数据,比如MonoBehaviour 组件和 ScriptableObjects.

4.属性面板

当你在属性面板上查看或者更改游戏物体的属性值时,unity是先序列化该数据,然后再把它显示出来,属性面板上更改了之后,直接序列化数据,覆盖原来的值,和脚本没有任何关系,也就是即使脚本中该变量有get set属性,也不会执行,这也就是在脚本中定义了变量值,在属性面板上给改了之后,使用的是面板上的值,因为面板是后序列化的。

 

5.序列化规则

 unity中的序列化实时运行的,所以对性能是有影响的,下面是一些序列化的条件:

  • public, 或者是private但是有 SerializeField 属性的可以序列化
  • static、const、readonly的可以被序列化
  • 在编辑器下私有字段是默认被序列化的

简单字段类型可以被序列化:

  • 自定义的非泛型,非抽象的类,且有Serializable 属性可以被序列化
  • 自定义的结构体 structs,带有Serializable 属性可以被序列化
  • 引用继承自 UnityEngine.Object的对象可以被序列化
  • 基本数据类型 (int, float, double, bool, string, etc.)
  • Enum types
  • 下面unity内置的类型可以被序列化: Vector2, Vector3, Vector4, Rect, Quaternion, Matrix4x4, Color, Color32, LayerMask, AnimationCurve, Gradient, RectOffset, GUIStyle
  • 对于私有字段,在加载脚本的时候是序列化的,被载入了值,在外部是不能够对其序列化的,要想在外部对其序列化,要加上serializationField属性

含有上面类型的数组和列表可以被序列化,字典不可以被序列化

Note: Unity不支持多级序列化,比如 (多维数组,交叉数组,嵌套类型).如果你想序列化这些,有两种方法,一个是把嵌套类型封装到类或者结构体内,第二个是实现ISerializationCallbackReceiver 的回调函数,后面有介绍

下面是一个类是不是可以序列化的标志:

 

6.序列化的技巧

  • 声明你的变量,目的是让Unity序列化尽可能小的数据集。这样做的主要目的不是为了节省计算机硬盘上的空间,而是确保您可以与项目的前一个版本保持向后兼容。如果您使用大量的序列化数据集,那么在开发的后期,向后兼容性会变得更加困难.

  • 不要序列化重复的数据或缓存的数据。这对向后兼容性造成了重大问题:它有很高的出错风险,因为数据太容易失去同步.

  •  independent of the data and only dependent on what is exposed in the script. The only way to reference other objects is through classes derived from UnityEngine.Object. These classes are completely separate; they only reference each other and they don’t embed the contents.

.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TO_ZRG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值