跳转至

序列化系统

核心原则

Odin 不覆盖 Unity 序列化,只是扩展它;一个类可同时拥有 Unity 与 Odin 序列化字段。

Odin 强大的序列化只有在直接实现时才生效。

SerializedMonoBehaviour 系列(直接继承即开启 Odin 序列化)

类名 说明
SerializedMonoBehaviour 最常用
SerializedBehaviour / SerializedComponent 行为 / 组件
SerializedScriptableObject ScriptableObject
SerializedNetworkBehaviour 网络行为
SerializedStateMachineBehaviour 状态机行为
SerializedUnityObject Unity 对象

⚠️ 无传递性Second : FirstFirst : SerializedMonoBehaviourSecond 不会继承 Odin 序列化——只有直接继承才有效。

字段序列化

[SerializeField] private int myField;          // Unity 序列化(新版推荐)
// 新版 Odin 官方不再建议 [OdinSerialize],改用 [SerializeField]

强制使用 Odin 序列化

非 Odin 基类类型中,用 [NonSerialized] + [OdinSerialize] 组合强制:

// 错误:只加 [OdinSerialize],Unity 与 Odin 会双重序列化同一字段 → 数据冗余/细微错误
// 正确:阻止 Unity,交给 Odin
[NonSerialized, OdinSerialize]
public Dictionary<string, int> myDictionary;

自定义实现 Odin 序列化器

无法继承基类时,实现 ISerializationCallbackReceiver + UnitySerializationUtility

[ShowOdinSerializedPropertiesInInspector]
public class CustomSerializedScriptableObject : ScriptableObject, ISerializationCallbackReceiver
{
    [SerializeField, HideInInspector] private SerializationData serializationData;
    void ISerializationCallbackReceiver.OnAfterDeserialize() =>
        UnitySerializationUtility.DeserializeUnityObject(this, ref this.serializationData);
    void ISerializationCallbackReceiver.OnBeforeSerialize() =>
        UnitySerializationUtility.SerializeUnityObject(this, ref this.serializationData);
}

OdinEditor 接管规则

  • Preference - Editor Types 可看被 OdinEditor 覆盖绘制的类型。
  • ⚠️ 只有「具体到某个类」的自定义绘制才能阻止 OdinEditor 默认覆盖;自定义父类的绘制再让子类继承,仍会被 OdinEditor 覆盖。
  • 每次修改后必须点 Update Editors 才生效。

Unity 序列化基础

  • Unity 序列化作用于字段而非属性(属性只是字段的包装器)。
  • Inspector 优先级高于字段初始化:反序列化在对象生成后给字段赋值。
  • [SerializeReference] 三种用途:同一实例多引用 / 多态(抽象类或基类存储,重点) / 序列化 null。
[SerializeReference] public BaseInspector odinDraw = new DerivedInspector();   // Odin Draw:面板可改类型
[DrawWithUnity, SerializeReference] public BaseInspector unityDraw = new OtherInspector(); // Unity 原生:需改代码 Reset

序列化相关特性

特性 作用
[ShowOdinSerializedPropertiesInInspector] Inspector 显示 Odin 序列化字段
[OdinSerialize] 强制 Odin 序列化(配 [NonSerialized]
[DrawWithUnity] 强制 Unity 原生绘制某字段

💡 仅存简单数据到 JSON,用 Unity 自带 JsonUtility(比 Odin JSON 快得多);Odin 二进制极快,JSON 慢。