(유니티) 사운드 파일을 인스펙터에서 효과적으로 정리하기

  • DKLaw 

기본 유니티 강의는 오디오 소스를 인스펙터에 추가하는 것으로 나옵니다. 그런데 오디오 소스가 많아지면 어떤 사운드가 어떤 오디오 소스에 연결되었는지 헷갈려집니다. 인스펙터에는 오디오 소스에 연결된 오디오 클립의 이름도 접혀진 상태에서는 안보이므로 난감하죠.

따라서 스크립트에 오디오 클립의 이름과 파일을 효과적으로 정리할 수 있게 해주는 작업이 필요합니다.

이렇게요.

오디오소스 시리얼라이즈

1. 클래스 만들기

일단 인스펙터에 들어갈 자료형이 필요하므로 클래스를 만듭시다. 전 “audioserial.cs”파일을 이렇게 만들었습니다.

using UnityEngine;

[System.Serializable]
public class AudioSerial
{
    public string name; 
    public AudioClip audioClip;
}

2. 플레이어 스크립트에 선언

플레이어 무브먼트 스크립에 다음과 같이 선언합니다. 여기서 딕셔너리를 추가로 선언한 것은, 그냥 배열로만 정리하면 나중에 사운들 파일을 찾기 어렵기 때문에 배열을 딕셔너리로 옮기기 위해서입니다.

    // Audio clip array 
    public AudioSerial[] sounds;
    private Dictionary <string , AudioClip> audioMap = new Dictionary<string, AudioClip>();

    // Define unity Audiosource
    private AudioSource sndHurt;
    private AudioSource sndWalk;
    private AudioSource sndJump;

3. 사운드 할당 작업

다음과 같이 각 사운드를 할당하면 됩니다.

주의할 것은, AudioSource는 유니티의 컴퍼넌트이므로 단순히

“AudioSource sndHurt = new AudioSource();” 와 같은 형식으로는 동적으로 생성되지 않는다는 것입니다.

플레이어에 붙여야 할 유니티 컴퍼넌트이므로, “gameobject.Addcomponent” 메서드를 이용합니다.

    void Start()
    {
        controller = GetComponent<CharacterController2D>();

        playerStat = GetComponent<Stat>();

        SetSound();
    }

    void SetSound()
    {
        sndWalk = gameObject.AddComponent<AudioSource>();
        sndHurt = gameObject.AddComponent<AudioSource>();
        sndJump = gameObject.AddComponent<AudioSource>();

        foreach (AudioSerial audio in sounds)
        {
            audioMap.Add(audio.name, audio.audioClip);
        }

        sndHurt.clip = audioMap["HurtSound"];
        sndWalk.clip = audioMap["FootStep"];
        sndJump.clip = audioMap["JumpSound"];
    }

자 이제, 각 오디오 소스를 적절히 플레이하면 되겠죠?

이런 식으로 하면 어떤 오디오 소스가 어느 사운드에 연결되는지 헷갈리지 않으셔도 됩니다.