유니티에서 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)을 통해 문제를 해결할 수 있다. 상황에 맞는 방법을 선택해 프로젝트에 적용하면 된다.
'Unity > 팁' 카테고리의 다른 글
[Unity 유니티] 메모리 변수 변조 방지 - 치트 엔진 막기 (0) | 2025.01.08 |
---|---|
[Unity 유니티] 유니티 내에서 스크린샷 찍기 - Recorder (0) | 2023.09.03 |
[Unity 유니티] Coroutine 코루틴 yield return 최적화 (0) | 2023.08.26 |
[Unity 유니티] Update 를 Coroutine 으로 최적화 하기 (0) | 2023.08.25 |
[Unity 유니티] Api Compatibility Level .Net 4.x 가 없을 때 해결 방법 (0) | 2023.08.25 |