今天在研究Unity的官方文档,关于序列化的那一部分。卡在了Hot Reloading部分,于是找到了两篇参考文献: forum.unity.com/threads/tru…
Serialization in Unity | Unity Blog
要点: 我们使用UnityEditor的时候,每时每刻都在和序列化打交道,只不过我们并没有意识到而已。我们的scene就是一个序列化的文件(后缀为.scene),prefab也是一个序列化的数据文件,AnimatorController也是一个序列化的文件,ScripableObject也是一个序列化的文件,material也是一个序列化的文件。所以我们开发游戏的过程,基本上就是和序列化数据打交道的过程——即如何根据需要组织以及配置它们。 但是一到Runtime,Unity就会依据相应的规则deserialization这些序列化文件,由于unity的脚本语言使用的是C#,这些序列化文件自然就会被反序列化为具体的C#对象。
在custom Class具有[System Serizlizable]属性的情况下,例如:
class Test : MonoBehaviour
{
...
[System.Seriazable]
class CustomClass
{
...
}
}
如果Custom类型的字段指向null(两种情况:cca和ccb),并且没有加[SerializeReference]字段,:
class Test : MonoBehaviour
{
[SerialiazeField] CustomClass cca ;
[SerialiazeField] CustomClass ccb = null ;
[System.Seriazable]
class CustomClass
{
...
}
}
那么根据Unity的序列化规则,在序列化数据中,cca和ccb将分别按值持有两个CustomClass的实例(根据CustomClass的默认构造函数 。)。
如果添加了[SerializeReference]属性:
class Test : MonoBehaviour
{
[SerializeReference]
[SerialiazeField] CustomClass cca ;
[SerializeReference]
[SerialiazeField] CustomClass ccb = null ;
[System.Seriazable]
class CustomClass
{
...
}
}
那么根据序列化规则,在序列化数据中,将把cca和ccb按引用指向null。