//============= Copyright (c) Ludic GmbH, All rights reserved. ============== // // Purpose: Part of the My Behaviour Tree Code // //============================================================================= using System.Collections; using System.Collections.Generic; using UnityEngine; using System; namespace MyBT { /// <summary> /// usage: /// [System.Serializable] public class DictionaryOfStringAndInt : SerializableDictionary<string, int> {} /// </summary> [Serializable] public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ISerializationCallbackReceiver { [SerializeField] private List<TKey> keys = new List<TKey>(); [SerializeField] private List<TValue> values = new List<TValue>(); // save the dictionary to lists public void OnBeforeSerialize() { keys.Clear(); values.Clear(); foreach(KeyValuePair<TKey, TValue> pair in this) { // Debug.Log($"Serialize: {pair.Key} {pair.Value}"); keys.Add(pair.Key); values.Add(pair.Value); } } // load dictionary from lists public void OnAfterDeserialize() { this.Clear(); if(keys.Count != values.Count) { Debug.LogError("there are {0} keys and {1} values after deserialization. Make sure that both key and value types are serializable."); //throw new System.Exception(string.Format("there are {0} keys and {1} values after deserialization. Make sure that both key and value types are serializable.")); } for(int i = 0; i < keys.Count; i++) { // Debug.Log($"Serialize: {keys[i]} {values[i]}"); this.Add(keys[i], values[i]); } } } }