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] 属性。