그냥 SerializeField로 해서는 안되고,
Dictionary 클래스를 부모로 상속받는 클래스를 따로 만들어서 이 클래스를 사용해야 한다.
using System.Collections.Generic;
using UnityEngine;
[System.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>();
public void OnBeforeSerialize()
{
keys.Clear();
values.Clear();
foreach (KeyValuePair<TKey, TValue> kvp in this)
{
keys.Add(kvp.Key);
values.Add(kvp.Value);
}
}
public void OnAfterDeserialize()
{
this.Clear();
if(keys.Count != values.Count)
{
throw new System.Exception("No Key");
}
for(int i=0; i<keys.Count; ++i)
{
this.Add(keys[i], values[i]);
}
}
}
이 클래스를 불러올때는 그냥 Dictionary를 위에서 새로 상속받아 만든 클래스 이름으로 바꿔서 선언하면 된다.

이렇게 Inspector에 키와 값 형태로 출력되서 수정할 수 있게 된다.
(여기서는 클래스를 불러올때 약간 다르게 선언했는데 사실 그냥 Dictionary 쓰는 방식으로 이름만 바꿔서 바로 선언해도 상관없다.)
Dictionary 클래스 뿐만 아니라 ISerializationCallbackReceiver 인터페이스도 상속받아야 한다.
그렇지 않으면 Inspector에 뜨기는 하는데 실제로 가져오면 아무것도 들어오지 않는다.
보니까 OnBeforeSerialize 메소드와 OnAfterDeserialize 메소드가 작동되지 않는듯.