Unity 中的序列化器专门设计为在运行时高效地运行。因此,Unity 中的序列化行为与其他编程环境中的序列化有所不同。Unity 中的序列化器直接在 C# 类的字段上工作,而不是它们的属性,因此 Unity 仅在满足特定条件时才序列化你的字段。以下部分概述了如何在 Unity 中使用字段序列化。
要使用字段序列化,必须确保字段
public
,或具有 SerializeField 属性private
字段会被序列化,请参考 热重载static
const
readonly
List<T>
注意:Unity 不支持对多级类型(多维数组、交错数组、字典和嵌套容器类型)进行序列化。如果你想序列化这些类型,你有两种选择
为了让 Unity 序列化自定义类,必须确保类
当你将 UnityEngine.Object
派生类的实例分配给一个字段,而 Unity 保存该字段时,Unity 将该字段序列化为对该实例的引用。Unity 会独立地序列化该实例本身,因此在将多个字段分配给该实例时,不会对其进行复制。但是对于不从 UnityEngine.Object
派生的自定义类,Unity 会将该实例的状态直接包含在引用它们的 MonoBehaviour 或 ScriptableObject 的序列化数据中。这可以通过两种方式实现:内联和通过[SerializeReference]
。
[SerializeReference]
时,Unity 会按值内联序列化自定义类。这意味着,如果你将对自定义类实例的引用存储在多个不同的字段中,它们在序列化时会变成单独的对象。然后,当 Unity 反序列化这些字段时,它们会包含具有相同数据的不同的独立对象。[SerializeReference]
序列化:如果你确实指定了 [SerializeReference]
,Unity 会将该对象建立为托管引用。宿主对象仍然将对象直接存储在其序列化数据中,但存储在专门的注册表部分。
[SerializeReference]
会增加一些开销,但支持以下情况
[SerializeReference]
,那么它们在序列化时会变成单独的对象。[SerializeReference]
,Unity 仅序列化属于父类的字段。当 Unity 反序列化类实例时,它会实例化父类而不是派生类。
注意:内联序列化效率更高,除非你专门需要 [SerializeReference]
支持的某个功能,否则应该使用内联序列化。有关如何使用 [SerializeReference]
的完整详细信息,请参考 SerializeReference 文档。
Unity 通常不序列化属性,除非在以下情况下
public int MyInt
{
get => m_backing;
private set => m_backing = value;
}
[SerializeField] private int m_backing;
public int MyInt { get; set; }
如果你不希望 Unity 序列化具有自动生成字段的属性,请使用 [field: NonSerialized]
属性。