主要通过ISerializationCallbackReceiver接口来实现, 将所有的Value值存入List显示即可. 这里在value里存了一个Key 也可以将Key和value分别保存
public interface RecordValue<T>
{
public T Key { get; }
}
[Serializable]
public class RecordDictionary<TKey, TValue> : ISerializationCallbackReceiver, IEnumerable<KeyValuePair<TKey, TValue>>
where TValue : RecordValue<TKey>
{
[Tooltip("组")]
public TValue Peek => Group.Count > 0 ? Group[0] : default(TValue);
//缓存数据,通过key加快访问查询
[SerializeField]
Dictionary<TKey, TValue> table = new ();
public ICollection<TValue> Values => table.Values;
public TValue this[TKey index]
{
get => table[index];
set
{
if (table.ContainsKey(index))
table[index] = value;
else
table.Add(index, value);
}
}
public int Count => table.Count;
[SerializeField]
protected List<TValue> Group = new();
public void Remove(TKey _index)
{
if (table.ContainsKey(_index))
{
table.Remove(_index);
}
}
public bool Contains(TKey _index)
{
return table.ContainsKey(_index);
}
public void Clear()
{
table.Clear();
}
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return (IEnumerator<KeyValuePair<TKey, TValue>>)table.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return table.GetEnumerator();
}
public void OnBeforeSerialize()
{
Group.Clear();
foreach (var kv in table)
{
Group.Add(kv.Value);
}
}
public void OnAfterDeserialize()
{
table.Clear();
foreach (TValue value in Group)
{
if (table.ContainsKey(value.Key))
{
Debug.LogWarning("无法添加字段");
if(value.Key is string s)
{
//table.Add((TKey)s.FixedRename(), value);
}
continue;
}
table.Add(value.Key, value);
}
}
}