using System; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName = "Game/Data/" + nameof(DbData))] public class DbData : ScriptableObject { [Serializable] public class IntDict : UnitySerializedDictionary { } [Serializable] public class UintDict : UnitySerializedDictionary { } [Serializable] public class StringDict : UnitySerializedDictionary { } [Serializable] public class Vector3Dict: UnitySerializedDictionary { } [SerializeField] private IntDict intDict; [SerializeField] private UintDict uintDict; [SerializeField] private StringDict stringDict; } [Serializable] public struct SomeData { [SerializeField] int someInt; [SerializeField] float someFloat; } public abstract class UnitySerializedDictionary : Dictionary, ISerializationCallbackReceiver { [SerializeField, HideInInspector] private List keyData = new List(); [SerializeField, HideInInspector] private List valueData = new List(); 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]; } } void ISerializationCallbackReceiver.OnBeforeSerialize() { this.keyData.Clear(); this.valueData.Clear(); foreach (var item in this) { this.keyData.Add(item.Key); this.valueData.Add(item.Value); } } }