[내일배움캠프 TIL] C#의 Dictionary는 Unity의 Inspector에서는 볼 수 없습니다..

KYJ의 Tech Velog·2023년 10월 16일
0

TIL

목록 보기
46/71
post-thumbnail

Today I Learned

제목이 오늘 이야기하고자 하는 바를 모두 담고 있습니다. C#의 Dictionary는 Unity의 Inspector에서는 볼 수 없습니다..

Today I Done

문제

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 내의 값들은 순서가 없습니다. 순서의 개념이 없기 때문에 직렬화도 되지 않는 것입니다.

Tomorrow's Goal

  • 팀프로젝트 프로토타입 완성
  • 코드 카타 Clear

0개의 댓글