准备
ISerializationCallbackReceiver接口官方解释和示例
示例中的OnBeforeSerialize()持续调用,OnAfterDeserialize()数据改动调用
Unity中手动配置数据,自动转换为字典数据
using System;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class SerializationDictionary : ISerializationCallbackReceiver
{
[Serializable]
public class DictionaryElement
{
public int key;
public string value;
}
[SerializeField] List<DictionaryElement> dictionaryElements = new List<DictionaryElement>();
private Dictionary<int, string> dictionary = new Dictionary<int, string>();
public Dictionary<int, string> Dictionary { get => dictionary; }
public void OnAfterDeserialize()
{
dictionary = new Dictionary<int, string>();
var length = dictionaryElements.Count;
for (int i = 0; i < length; i++)
{
var element = dictionaryElements[i];
var key = element.key;
if (dictionary.ContainsKey(key))
{
Debug.Log(("key值重复", key));
}
else
{
var value = element.value;
dictionary.Add(key, value);
}
}
}
public void OnBeforeSerialize()
{
//不需要序列化
}
public void PrintDictionary()
{
foreach (var item in dictionary)
{
Debug.Log((item.Key, item.Value));
}
}
}
搭配ScriptableObject使用
using UnityEngine;
[CreateAssetMenu(menuName ="Data/ConfigDic",fileName ="测试字典")]
public class ConfigDic : ScriptableObject
{
public SerializationDictionary serializationDictionary;
}
测试
using UnityEngine;
public class Test : MonoBehaviour
{
[SerializeField] SerializationDictionary SerializationDictionary;
[SerializeField] ConfigDic testDic;
[ContextMenu("打印字典数据")]
void Print()
{
testDic.serializationDictionary.PrintDictionary();
SerializationDictionary.PrintDictionary();
}
}