Unity에서 소리가 발생하는 환경을 Scene에서 구현하고자 할때 상황을 다음과 같이 정리할 수 있다.
A가 내는 B소리를 C가 듣는다.
위 상황에서 필요한 요소는 총 세가지이다.
Unity에는 각각의 구성요소를 Component로 나타낼 수 있다. 위 세개중 하나라도 없으면 사용자는 소리를 들을 수 없을 것이다. Audio Listener
같은 경우 일반적으로 Camera에 존재한다.
Audio Source
는 위 상황에서 A에 해당하는 Component로 Audio Clip이나 Mute
, Loop
등 많은 옵션을 설정할 수 있다. 소리의 볼륨, 피치와 같은 특수효과도 추가할 수 있다.
AudioSource의 Play()
로 설정한 AudioClip을 재생할 수 있다. 또한, PlayOneShot(AudioClip)
으로 특정한 AudioClip을 재생하도록 할 수 있다.
AudioSource Component를 가지고 있는 GameObject가 소리를 재생중일 때 제거된다면 출력중인 소리가 중간에 끊긴다.
하나의 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 속성을 변경한다.
소리를 재생하는 Play()
의 경우 어떤 Clip을 어떤 Source으로 재생할지를 정해주어야 한다. 그렇기 때문에 Clip의 path
와 Source의 type
을 인수로 넘겨주어야 한다.
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;임을 기억하자.
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을 한번만 재생한다.
AudioSource의 3D Sound Settings
를 보면 3D Sound에 대한 세팅을 할 수 있다. 보통, 거리가 멀면 멀수록 들리는 소리가 작아지는데 이것에 대한 비율이나 AuidoSource에서 발생한 소리가 어디서부터 어디까지 들리는 Distance를 설정할 수 있다.
Volume Rolloff는 거리에 따른 Sound의 출력비율을 설정하는 것인데 Linear Rolloff
는 선형비율(1차 그래프)를 따르는 3D Sound이고 이 외에 Logarithmic Rolloff
, Custom Rolloff
가 있다.