【Unity小技巧】Unity字典序列化

发布于:2024-07-08 ⋅ 阅读:(38) ⋅ 点赞:(0)

字典序列化

在 Unity 中,标准的 C# 字典(Dictionary<TKey, TValue>)是不能直接序列化的,因为 Unity 的序列化系统不支持非 Unity 序列化的集合类型。可以通过手写字典实现

效果:

在这里插入图片描述

实现步骤:

  • 继承ISerializationCallbackReceiver接口自定义序列化和反序列化过程。

    • 序列化之前**—将数据保存到List**中

      ISerializationCallbackReceiver.OnBeforeSerialize()

    • 反序列化之后调用 — 从List中恢复数据

      ISerializationCallbackReceiver.OnAfterDeserialize()

  • 需导入序列化插件odin,否则无法在Inspector面板看到

    • 地址:https://download.csdn.net/download/Xz616/89503957

代码:

public abstract class UnitySerializedDictionary<TKey, TValue> : Dictionary<TKey, TValue>,
        ISerializationCallbackReceiver
    {
        [SerializeField, HideInInspector] private List<TKey> keyData = new List<TKey>();

        [SerializeField, HideInInspector] private List<TValue> valueData = new List<TValue>();

        /// <summary>
        /// 反序列化之后调用 --- 从List中恢复数据
        /// </summary>
        void ISerializationCallbackReceiver.OnAfterDeserialize()
        {
            this.Clear();
            for (int i = 0; i < this.keyData.Count && i < this.valueData.Count; i++)
            {
                this[this.keyData[i]] = this.valueData[i];
            }
        }

        /// <summary>
        /// 序列化之前调用---将数据保存到List中
        /// </summary>
        void ISerializationCallbackReceiver.OnBeforeSerialize()
        {
            this.keyData.Clear();
            this.valueData.Clear();

            foreach (var item in this)
            {
                this.keyData.Add(item.Key);
                this.valueData.Add(item.Value);
            }
        }
    }

网站公告

今日签到

点亮在社区的每一天
去签到