주말이다!
주말에도 열심히 과제를 구현했다.
토요일은 UI를 전체적으로 통일했고,
오늘은 오디오를 재생할 수 있게 기능을 구현했다!
09.09 - UI
09.10 - Audio
골드메탈님의 강의를 통해 배열로 다양한 소리를 관리하는 AudioManger 제작방법을 알게 됐다.
약간의 응용이 필요했는데, 강의는 단일 Scene에서 모든게 이루어지지만,
팀 프로젝트는 StartScene과 MainScene에서 이뤄진다.
그래서, 게임을 플레이하는 GameManager는 MainScene에 존재하는데,
AudioManager를 어디에 둬야할지 고민이었다.
답은 간단했다!
게임이 시작되고, 처음 Audio가 나오는 Scene은 StartScene다.
따라서 StartScene에 구현했다!
UI는 MainScene의 GameOver와 전체적인 UI 디자인을 통일했다.
BGM 은 StartScene과 MainScene에서 재생된다.
배열로 설정하자
[Header("#BGM")]
public AudioClip[] bgmClip;
public float bgmVolume;
public int bgmChannels;
AudioSource[] bgmPlayers;
int bgmChannelIndex;
enum을 이용해서 각 BGM의 Index를 설정한다.
public enum Bgm { StartScene, MainScene }
AudioManger를 싱글톤화하고, MainScene으로 전환되어도 파괴되지 않게
DontDestroyOnLoad
를 사용했다.
void Awake()
{
instance = this;
Init();
// MainScene으로 넘어가도 파괴되지 않게 설정.
DontDestroyOnLoad(this.gameObject);
}
Init으로 초기화를 진행한다.
// 배경음 초기화
GameObject bgmObject = new GameObject("BgmPlayer");
bgmObject.transform.parent = transform;
bgmPlayers = new AudioSource[bgmChannels];
for(int bgmIndex = 0; bgmIndex < bgmPlayers.Length; bgmIndex++)
{
bgmPlayers[bgmIndex] = bgmObject.AddComponent<AudioSource>();
bgmPlayers[bgmIndex].playOnAwake = false;
bgmPlayers[bgmIndex].volume = bgmVolume;
}
이후 플레이 메서드를 구현하면 끝!
public void PlayBgm(Bgm bgm)
{
for(int index = 0; index < bgmPlayers.Length; index++)
{
int loopIndex = (index + bgmChannelIndex) % bgmPlayers.Length;
if (bgmPlayers[loopIndex].isPlaying)
{
continue;
}
bgmChannelIndex = loopIndex;
bgmPlayers[loopIndex].clip = bgmClip[(int)bgm];
bgmPlayers[loopIndex].Play();
break;
}
}
다른 함수에서, AudioManger에 접근하려면 해당 함수를 사용하면 된다.
AudioManager.instance.PlayBgm(AudioManager.Bgm.MainScene);
에셋 제작하기, BGM 찾기, UI 수정하기