본문 바로가기

Unity/팁

[Unity 유니티] 유니티 인스펙터 Dictionary 안나옴 - Serializable 직렬화 문제와 해결 방법 (SerializableDictionary)

유니티에서 Dictionary 타입은 매우 유용하지만, 인스펙터에 기본적으로 표시되지 않는다. 이는 유니티의 기본 직렬화 시스템이 Dictionary를 지원하지 않기 때문이다.

유니티의 직렬화 시스템은 System.Serializable 속성을 사용하여 필드를 직렬화하지만, 배열(Array), 리스트(List) 등 일부 자료형만 지원한다. Dictionary는 키-값 쌍을 저장하기 위해 복잡한 구조를 가지기 때문에 기본적으로 직렬화되지 않는다.


해결 방법

Dictionary를 인스펙터에서 사용할 수 있게 하려면 커스텀 솔루션을 사용해야 한다.

SerializableDictionary는 커스텀 클래스나 패키지를 만들어 사용하는 방법이다.

using System;
using System.Collections.Generic;
using UnityEngine;

[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 (var kvp in this)
        {
            keys.Add(kvp.Key);
            values.Add(kvp.Value);
        }
    }

    public void OnAfterDeserialize()
    {
        this.Clear();

        if (keys.Count != values.Count)
            throw new Exception("키와 값의 개수가 일치하지 않습니다.");

        for (int i = 0; i < keys.Count; i++)
        {
            this[keys[i]] = values[i];
        }
    }
}

사용 방법

public class Example : MonoBehaviour
{
    public SerializableDictionary<string, int> exampleDict = new SerializableDictionary<string, int>();
}

유니티 인스펙터에서 Dictionary를 직접적으로 사용할 수는 없지만, 커스텀 클래스를 만들어서 SerializableDictionary를 사용하거나 외부 툴(Odin Inspector)을 통해 문제를 해결할 수 있다. 상황에 맞는 방법을 선택해 프로젝트에 적용하면 된다.