How to Manage AudioClips with Dictionary in Unity

How to Manage AudioClips with Dictionary in Unity

When working with multiple AudioClips in Unity, it's useful to register them via the Inspector and access them efficiently at runtime. In this guide, we will look at how to manage AudioClips using a key-based Dictionary, and how to register those clips using a Serializable class and a List.

System.Serializable

Let's start with the [System.Serializable] attribute, which you'll often see when defining classes like this:

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

This attribute allows Unity to display the class fields in the Inspector. Without Serializable, Unity will not show the fields key and clip, making it impossible to register AudioClips visually.

If you want to assign AudioClip data via the Inspector, this attribute is essential.

Why use class instead of struct?

In C#, you can define data using either class or struct. However, when working with data in List or Dictionary in Unity, using a class is generally more appropriate.

  • struct is a value type, so adding it to a list or dictionary causes copies to be made, which can lead to unintended behavior.
  • class is a reference type, so the data remains stable and modifiable.
  • class types are handled more flexibly in the Inspector.

Declaring a List for Inspector Input

public List<KeyAudioClip> soundList;

Unity does not allow you to edit Dictionary types directly in the Inspector. So we use a List instead to register the audio data.

Using a List<KeyAudioClip>, we can add as many entries as we want, entering the key and assigning the AudioClip via the Inspector.

Audio Clip in Inspector

At runtime, we convert this list into a dictionary for fast access.

Convert the Audio List to a 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}}");
        }
    }
}

This function loops through soundList and adds each item to the dictionary if the key is not already present. With this approach, you can retrieve and play clips using string keys quickly and easily.

Usage Example

public AudioSource audioSource;

public void PlaySound(string key)
{
    if (soundClipsDict.TryGetValue(key, out AudioClip clip))
    {
        audioSource.PlayOneShot(clip);
    }
    else
    {
        Debug.LogWarning($"Sound key not found: {{key}}");
    }
}

With this setup, you can register keys like "Hit" or "Fly" and play them by simply passing the key string. This approach also makes it easy for designers to assign sounds directly in the Inspector.

Summary

  • [System.Serializable] enables custom classes to be editable in the Unity Inspector.
  • Use List<T> to register audio data, then convert to Dictionary<string, AudioClip> at runtime.
  • This method allows fast, key-based access to audio clips and is widely used in Unity projects.

Popular posts from this blog

Understanding Arrays as Reference Types in C#

Setting Up a Basic Follow Camera with Cinemachine 3.x

Understanding and Using ? (nullable) in C#