문제점

ScriptableSingleton<T>을 쓸 때, 자연스럽게 딕셔너리를 사용해버렸는데, 사실 ScriptableSingleton에서 유지되는 ScriptableObject 객체라도 딕셔너리는 직렬화되지 않는다. 그래서 dictTest는 에디터가 리로딩되는 과정에서 역직렬화를 수행하게 되면 null값으로 변하게 된다. 사실 ScriptableSingleton도 ScriptableObject를 상속받아 구현되는 것이기에 당연한 것인데, 생각이 짧았다.

public class HCManagers : ScriptableSingleton<HCManagers>
{
    private HCModel _model;

    public Dictionary<string, int> dictTest;

    public static HCModel Model
    {
        get => instance._model;
    }

    private void Awake()
    {
        instance.dictTest = new Dictionary<string, int>()
        {
            { "Test1", 1 },
            { "Test2", 2 }
        };

        instance._model = CreateInstance<HCModel>();
    }
}

 

또한 `HCModel`도 ScriptableObject를 상속받아 제작한 클래스이기에, 직렬화되는 과정에서 딕셔너리를 포함한 직렬화되지 못하는 것들은 모두 날라간다.

public class HCModel : ScriptableObject
{
    public Dictionary<ToggleMode, bool> isToggleActives;

    public HexGridGenerator hexGridGenerator = new HexGridGenerator();

    public Material selectedMaterial = null;

    public List<GameObject> selectedObjects = new List<GameObject>();

    private void Awake()
    {
        Init();
    }

    // 테스트
    private void Init()
    {
        isToggleActives = new Dictionary<ToggleMode, bool>()
        {
            { ToggleMode.MaterialEditing, false },
            { ToggleMode.ObjectSelecting, false },
        };
    }
}

 

 

직렬화전, 역직렬화 후의 값 확인

직렬화 전 (에디터 리로드 전)
역직렬화 후 (에디터 리로드 후)

 

에디터 리로딩 후 직렬화되지 못하는 것들은 싹다 null값으로 대체된다. 에디터의 상태 저장은 PlayerPrefs 사용을 고려해보아야겠다,