unity 的序列化机制

429 阅读1分钟

今天在研究Unity的官方文档,关于序列化的那一部分。卡在了Hot Reloading部分,于是找到了两篇参考文献: forum.unity.com/threads/tru…

gist.github.com/cobbpg/a74c…

Serialization in Unity | Unity Blog

forum.unity.com/threads/ter…

要点: 我们使用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。