본문 바로가기
Unity

Audio Clip 을 Dictionary 로 관리하기 : Serializable 과 List 활용

by Oz Driver 2025. 4. 8.

Unity 에서 여러 AudioClip 을 관리하는 다양한 방법들이 존재하지만, 이번 글에서는 AudioClip 을 key 기반으로 관리할 수 있도록 Dictionary를 활용하고, Unity Inspector 창에서 오디오 데이터를 등록할 수 있도록 Serializable 클래스와 List 를 함께 사용하는 방법에 대해 소개하겠습니다.

 

 

System.Serializable

먼저 아래와 같이 클래스를 정의할 때 자주 보게 되는 [System.Serializable] 속성부터 살펴보겠습니다.

[System.Serializable]
public class KeyAudioClip
{
    public string key;
    public AudioClip clip;
}

 

이 속성은 Unity가 해당 클래스를 Inspector 창에 표시할 수 있도록 만들어 줍니다. 즉, Serializable이 없으면 Unity는 내부 필드인 key와 clip을 Inspector에 표시하지 않으며, 직접 값을 입력하거나 오디오 클립을 연결하는 것이 불가능합니다.

따라서 Unity Inspector에서 AudioClip 데이터를 시각적으로 등록하고 싶다면 반드시 이 속성을 붙여주어야 합니다.

 

 

class KeyAudioClip

C# 에서는 데이터를 정의할 때 class 또는 struct 중 하나를 선택할 수 있습니다. 하지만 Unity 에서 List 나 Dictionary 형태로 데이터를 다루려면 class를 사용하는 것이 일반적입니다.

 

그 이유는 다음과 같습니다

* struct는 값 형식이기 때문에 리스트나 딕셔너리에 넣으면 복사가 발생하여 원본과 값이 다르게 바뀔 수 있습니다.

* class는 참조 형식이므로 데이터를 안정적으로 공유하고 수정할 수 있습니다.

* Unity Inspector에서도 class가 더 유연하게 동작합니다.

 

따라서 사용자 정의 데이터를 여러 개 등록하고 다루는 경우에는 struct보다 class가 더 적합합니다.

 

 

Inspector 에서 데이터를 넣기 위해 List 로 선언

public List<KeyAudioClip> soundList;

 

Unity에서는 Dictionary 타입을 Inspector에서 직접 편집할 수 없습니다. 따라서 오디오 클립 데이터를 등록할 때는 먼저 List 형태로 선언하여 Inspector에 노출시킵니다.

이렇게 하면 key와 clip을 원하는 만큼 등록할 수 있으며, 인스펙터를 통해 직접 값을 넣는 것이 가능합니다.

 

 

런타임에서는 이 리스트를 Dictionary 로 변환하여 빠르게 검색하고 사용할 수 있도록 구성합니다.

 

 

오디오 클립을 Dictionary 로 변환

public Dictionary<string, AudioClip> soundClipsDict;

private void LoadSoundClips()
{
    soundClipsDict = new Dictionary<string, AudioClip>();

    foreach (var pair in soundList)
    {
        if (!soundClipsDict.ContainsKey(pair.key))
        {
            soundClipsDict.Add(pair.key, pair.clip);
            Debug.Log($"Loaded sound clip : {pair.key}");
        }
    }
}

 

이 함수는 soundList에 등록된 데이터를 순회하면서, 중복된 키가 없을 경우에만 Dictionary에 추가합니다. 이렇게 하면 오디오 클립을 문자열 키로 바로 접근할 수 있으므로 관리와 재생이 훨씬 간편해집니다.

 

사용 예시

실제로 오디오를 재생할 때는 아래처럼 키를 이용하여 오디오 클립을 찾아 재생합니다.

public AudioSource audioSource;

public void PlaySound(string key)
{
    if (soundClipsDict.TryGetValue(key, out AudioClip clip))
    {
        audioSource.PlayOneShot(clip);
    }
    else
    {
        Debug.LogWarning($"사운드 키를 찾을 수 없습니다: {key}");
    }
}

 

이 코드를 활용하여, 미리 정의된 "Hit" 나 "Fly" 같은 문자열 키로 사운드를 재생할 수 있게 됩니다.

 

 

마무리 

* [System.Serializable] 속성을 사용하면 사용자 정의 클래스도 Unity Inspector에서 편집할 수 있습니다.

* List <T>으로 오디오 데이터를 등록하고, 런타임에는 Dictionary<string, AudioClip>으로 변환하여 키 기반으로 관리합니다.

* 이는 key 를 이용해 빠르게 오디오를 찾아 재생할 수 있는 구조이므로, 종종 사용되는 방식입니다.