BGM Player라는 이름으로 Audio Source 오브젝트를 하나 생성해준 후 BGM 오디오 클립을 드래그드랍으로 초기화 해준다.
BGM 시작을 스크립트 상에서 진행하기 위해 자동 시작 비활성화 및 BGM은 계속 반복되어야 하므로 루프 활성화
이제 게임 매니저에 bgmPlayer 변수를 선언한 후 인스펙터에서 초기화 해준다.
public AudioSource bgmPlayer;
private void Start()
{
bgmPlayer.Play();
NextDongle();
}
배경음과 동일하게 SFX Player라는 이름으로 Audio Source 오브젝트를 생성해준다.
이제 Ctrl + D로 SFX Player를 총 세 개 만들어준다.
효과음을 하나의 Audio Source로 실행하면 AudioClip을 교체하면 재생 중인 음원은 짤리는 문제가 발생한다.
이제 게임 매니저에 오디오 소스가 담길 배열 변수, 효과음을이 담길 배열 변수, 다음에 실행될 오디오를 가리킬 변수를 선언한다.
enum 형으로 효과음들을 선언해서 오타로 인해 발생하는 문제를 미연에 방지한다.
public AudioSource bgmPlayer;
public AudioSource[] sfxPlayer;
public AudioClip[] sfxClip; //여러 효과음들이 담길 변수
public enum Sfx { LevelUp, Next, Attach, Button, Over };
int sfxCursor; //다음에 재생할 AudioSource를 가리킬 변수
public void SfxPlay(Sfx type)
{
switch(type)
{
case Sfx.LevelUp:
sfxPlayer[sfxCursor].clip = sfxClip[Random.Range(0, 3)]; //레벨업은 소리가 3개라서 랜덤하게 실행
break;
case Sfx.Next:
sfxPlayer[sfxCursor].clip = sfxClip[3];
break;
case Sfx.Attach:
sfxPlayer[sfxCursor].clip = sfxClip[4];
break;
case Sfx.Button:
sfxPlayer[sfxCursor].clip = sfxClip[5];
break;
case Sfx.Over:
sfxPlayer[sfxCursor].clip = sfxClip[6];
break;
}
sfxPlayer[sfxCursor].Play(); //재생시킬 AudioClip이 들어간 Audio Source를 실행
sfxCursor = (sfxCursor + 1) % sfxPlayer.Length; //계속해서 3개의 오디오 소스를 순환하도록 구현
}
이제 각각의 효과음들이 필요한 상황에 실행되도록 로직을 구현한다.
manager.SfxPlay(GameManager.Sfx.LevelUp);
SfxPlay(Sfx.Next);
yield return new WaitForSeconds(1f);
SfxPlay(Sfx.Over);
Attach 효과음은 사물에 부딪힐때 재생되도록 구현한다.
void OnCollisionEnter2D(Collision2D collision)
{
StartCoroutine(AttachRoutine());
}
IEnumerator AttachRoutine() //충돌음 제한을 위한 코루틴
{
if(isAttach) //이미 충돌음을 실행했다면
yield break; //코루틴을 탈출한다.
isAttach = true;
manager.SfxPlay(GameManager.Sfx.Attach);
yield return new WaitForSeconds(0.2f); //0.2f 동안 다른 충돌은 무시
isAttach = false;
}
yield break : 코루틴을 탈출하기 위한 함수
gif에는 효과음 첨부가 불가능해서 생략한다.