AudioSource[] _audioSources = new AudioSource[(int)Define.Sound.MaxCount];
Dictionary<string, AudioClip> _audioClips = new Dictionary<string, AudioClip> ();
사운드 리소스들을 BGM, Effect 등으로 구분하여 관리하기 위한 배열 하나와
코드의 최적화를 위한 Dictionary 타입 변수 하나를 선언했다.
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++) // Define.Sound의 마지막 항목은 MaxCount라는 필요없는 값이기 때문에 -1을 해준다.
{
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라는 컴포넌트를 생성하도록 한다.
public void Play(string path, Define.Sound type = Define.Sound.Effect, float pitch = 1.0f)
{
AudioClip audioClip = GetOrAddAudioClip(path, type);
Play(audioClip, type, pitch);
}
public void Play(AudioClip audioClip, Define.Sound type = Define.Sound.Effect, float pitch = 1.0f)
{
if (audioClip == null)
return;
if (type == Define.Sound.Bgm)
{
AudioSource audioSource = _audioSources[(int)Define.Sound.Bgm];
if (audioSource.isPlaying)
audioSource.Stop();
audioSource.pitch = pitch;
audioSource.clip = audioClip;
audioSource.Play();
}
else
{
AudioSource audioSource = _audioSources[(int)Define.Sound.Effect];
audioSource.pitch = pitch;
audioSource.PlayOneShot(audioClip);
}
}
path를 인자로 받아서 오디오 클립을 불러오는 함수와 오디오 클립 자체를 인자로 받는 함수를 작성했다.
인자로 받은 type의 값이 BGM이면 계속해서 Play하도록 하고 Effect인 경우에는 한번만 Play하도록 하였다.
AudioClip GetOrAddAudioClip(string path, Define.Sound type = Define.Sound.Effect)
{
AudioClip audioClip = null;
if (path.Contains("Sounds/") == false)
path = $"Sounds/{path}";
if (type == Define.Sound.Bgm)
{
audioClip = Managers.Resource.Load<AudioClip>(path);
}
else
{
if (_audioClips.TryGetValue(path, out audioClip) == false)
{
audioClip = Managers.Resource.Load<AudioClip>(path);
_audioClips.Add(path, audioClip);
}
}
if (audioClip == null)
Debug.Log($"AudioClip Missing! {path}");
return audioClip;
}
Play() 함수에서 path로 오디오 클립을 전달받는 경우를 위해 작성하였다.