제목이 오늘 이야기하고자 하는 바를 모두 담고 있습니다. C#의 Dictionary는 Unity의 Inspector에서는 볼 수 없습니다..
Unity로 프로젝트를 진행하다보면 Dictionary를 정말 자주 사용하게 됩니다. 그만큼 유용한 자료구조입니다.
하지만 이 유용한 자료구조에도 사용자에게 있어 치명적인 단점(?)이 있습니다.
바로 Inspector에서는 제어할 수가 없다는 것입니다. Unity의 Inspector에서는 여러 컴포넌트를 편하게 관리활 수 있습니다. 눈에 잘 보이지 않는 스크립트에서만 작업하는 것이라 눈에 보이는 곳에서 많이 작업할 수 있게 되죠.
Unity에서 Dictionary는 직렬화가 지원되지 않기 때문에 Inspector에서 수정할 수가 없습니다.
Dictionary 그대로 직렬화할 수 있는 방법이나 Inspector에서 찾아볼 수 있는 방법을 열심히 찾아보았습니다. 하지만 Generic으로 제공되는 Dictionary를 직렬화하거나 Inspector에서 건드릴 수 있는 방법은 없었습니다.
결국 자신만의 직렬화가 가능한 클래스를 새로 만들어야 됩니다.
저는 클래스까지 선언하기에는 Dictionary가 방대하지 않기 때문에 조금 더 간단하게 해결하고자 했습니다. Key와 Value의 배열을 각각 선언해서 Inspector에서 원소 추가 및 수정을 진행하고 스크립트에서 이 배열들을 이용해 Dictionary를 새로 만들어주었습니다.
[SerializeField] private string[] bgmClipsKeys;
[SerializeField] private AudioClip[] bgmClipsValues;
private Dictionary<string, AudioClip> bgmClips;
[SerializeField] private string[] sfxClipsKeys;
[SerializeField] private AudioClip[] sfxClipsValues;
private Dictionary<string, AudioClip> sfxClips;
private void Awake()
{
bgmClips = new Dictionary<string, AudioClip>();
sfxClips = new Dictionary<string, AudioClip>();
for (int i = 0; i < bgmClipsKeys.Length; i++)
{
bgmClips.Add(bgmClipsKeys[i], bgmClipsValues[i]);
}
for (int i = 0; i < sfxClipsKeys.Length; i++)
{
sfxClips.Add(sfxClipsKeys[i], sfxClipsValues[i]);
}
}
사실 클래스를 선언하는 것도 결국에 방법은 비슷합니다. Key와 Value의 배열을 클래스 내에서 생성해서 KeyValuePair를 관리합니다. 그 배열들을 통해 Dictionary를 만드는 것입니다.
그저 클래스로 따로 선언해서 더 관리하기 편하게 만들어졌냐 아니야의 차이 정도로 보시면 됩니다. (자세히 설명하자면 더 있겠지만...)
사실 계속 왜 Dictionary는 그냥 직렬화가 안 되는 것일까를 찾는 데 집중하였습니다.
제가 내린 결론은 Dictionary는 단순히 선형인 자료구조가 아니기 때문이란 것입니다. Dictionary 내의 값들은 순서가 없습니다. 순서의 개념이 없기 때문에 직렬화도 되지 않는 것입니다.