[Unity] Sound

이정석·2023년 7월 1일
0

Unity

목록 보기
10/22

Sound

Unity에서 소리가 발생하는 환경을 Scene에서 구현하고자 할때 상황을 다음과 같이 정리할 수 있다.

A가 내는 B소리를 C가 듣는다.

위 상황에서 필요한 요소는 총 세가지이다.

  • 소리를 내는 Object(Audio Source)
  • 발생한 소리(Audio Clip)
  • 소리를 듣는 Object(Audio Listener)

Unity에는 각각의 구성요소를 Component로 나타낼 수 있다. 위 세개중 하나라도 없으면 사용자는 소리를 들을 수 없을 것이다. Audio Listener같은 경우 일반적으로 Camera에 존재한다.

1. AudioSource

Audio Source는 위 상황에서 A에 해당하는 Component로 Audio Clip이나 Mute, Loop 등 많은 옵션을 설정할 수 있다. 소리의 볼륨, 피치와 같은 특수효과도 추가할 수 있다.

AudioSource의 Play()로 설정한 AudioClip을 재생할 수 있다. 또한, PlayOneShot(AudioClip)으로 특정한 AudioClip을 재생하도록 할 수 있다.

AudioSource Component를 가지고 있는 GameObject가 소리를 재생중일 때 제거된다면 출력중인 소리가 중간에 끊긴다.

2. Initiate

하나의 AudioSource에서 서로 다른 2개 이상의 AudioClip을 재생할 수 있는데 그렇다면 하나의 AudioSource만 있으면 되는건가?

BGM같은 경우 loop 속성을 킨 AudioSource가 필요하고 효과음 같은 경우 loop가 필요 없다. 즉, 서로 다른 속성을 가진 AudioSource가 2개 이상 필요할 수도 있다.

다음 코드는 여러개의 AudioSource를 생성하고 각 Sound를 할당하는 코드이다.

    AudioSource[] _audioSources = new AudioSource[(int)Define.Sound.MaxCount];

    public void Init()
    {
        GameObject root = GameObject.Find("@Sound");
        if (root == null)
        {
            root = new GameObject { name = "@Sound" };
            Object.DontDestroyOnLoad(root);

            string[] soundNames = System.Enum.GetNames(typeof(Define.Sound));
            for (int i = 0; i < soundNames.Length - 1; i++)
            {
                GameObject go = new GameObject { name = soundNames[i] };
                _audioSources[i] = go.AddComponent<AudioSource>();
                go.transform.parent = root.transform;
            }

            _audioSources[(int)Define.Sound.Bgm].loop = true;
        }
    }

구조는 @Sound GameObject산하에 AudioSource를 가진 GameObject들을 저장하는 방식이다. 생성 후 BGM을 담당하는 audioSource의 loop 속성을 변경한다.

3. Play

소리를 재생하는 Play()의 경우 어떤 Clip을 어떤 Source으로 재생할지를 정해주어야 한다. 그렇기 때문에 Clip의 path와 Source의 type을 인수로 넘겨주어야 한다.

  • BGM의 경우
        if (type == Define.Sound.Bgm)
        {
            AudioClip audioClip = Managers.Resource.Load<AudioClip>(path);

            AudioSource audioSource = _audioSources[(int)Define.Sound.Bgm];
            audioSource.pitch = pitch;
            audioSource.clip = audioClip;
            audioSource.Play();
        }

위의 Initiate에서 BGM의 AudioSource.loop=true;임을 기억하자.

  • Effect의 경우
        else
        {
            AudioClip audioClip = Managers.Resource.Load<AudioClip>(path);

            AudioSource audioSource = _audioSources[(int)Define.Sound.Effect];
            audioSource.pitch = pitch;
            audioSource.PlayOneShot(audioClip);
        }

AudioSource.PlayOneShot(AudioClip)은 AudioClip을 한번만 재생한다.


3D Sound

AudioSource의 3D Sound Settings를 보면 3D Sound에 대한 세팅을 할 수 있다. 보통, 거리가 멀면 멀수록 들리는 소리가 작아지는데 이것에 대한 비율이나 AuidoSource에서 발생한 소리가 어디서부터 어디까지 들리는 Distance를 설정할 수 있다.

Volume Rolloff는 거리에 따른 Sound의 출력비율을 설정하는 것인데 Linear Rolloff는 선형비율(1차 그래프)를 따르는 3D Sound이고 이 외에 Logarithmic Rolloff, Custom Rolloff가 있다.

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글