본문 바로가기

Today I Learned

[TIL][Unity] 배경음악 랜덤 재생하기

배경음악 랜덤 재생하기

대부분의 온라인 및 오프라인 심지어 인디게임에서도 배경음악(BGM)이 랜덤하게 재생된다. 이 배경음악이 게임의 분위기나 상황을 더욱 고조시키는데에 크게 이바지하기 때문에 게임에서 BGM의 역할은 결코 작다고 할 수 없다. 나는 그래서 우리 프로젝트에 하나의 BGM을 반복하여 재생하는 것이 아닌 랜덤한 BGM을 재생시키고 싶었다.

 

사운드클립 배열 만들기

배경음악이 아무런 기준도 없이 랜덤하게 재생된다면 어떠할까? 예를 들어 죽음을 앞둔 기사의 마지막 모습에서 상큼발랄한 BGM이 재생된다고 가정해보자. 이는 게임의 분위기를 고조시키기는 고사하고 해치게 될 것이다. 따라서 사운드클립 배열을 만들어 비슷한 분위기의 사운드클립을 모아 그 중에서 랜덤 재생 시키는 것이 바람직하다.

public AudioClip[] music = new AudioClip[10];

 

위와 같은 AudioClip 배열을 만들어 Unity의 Inspector창에서 직접 배정하였다. 

Audio 게임오브젝트의 Inspector에서 배열 설정

이 때 Audio Source의 필드값에서 가장 중요한 점은 Play On Awake의 체크를 풀어주는 것이다. Play On Awake의 역할은 Scene이 로드되었을 때 사운드클립을 재생하는 것인데, 우리는 랜덤한 BGM을 재생하기 원하므로 이 것의 체크를 해제한다.

 

BGM Controller 작성하기

우리가 지금까지 진행한 사항만으로는 BGM이 재생되지 않는다. 프로그램에 배열에 있는 BGM을 재생하라는 명령을 하지 않았기 때문이다. 그렇다면 배열에 있는 BGM을 어떻게 랜덤하게 재생시킬 수 있을까?

이를 제어하기 위해 BGM Controller.cs를 작성한다.

 void Update()
 {
     if(!audioSource.isPlaying)
     {
         RandomPlay();
     }
 }

 private void RandomPlay()
 {
     audioSource.clip = music[Random.Range(0, music.Length)];
     audioSource.Play();
 }

 

위 코드를 설명하면, Update 메서드에서 참조한 Audio Source가 BGM을 재생중이지 않다면 RandomPlay 메서드를 수행한다. RandomPlay 메서드에서는 Audio Source의 재생할 clip을 music이라는 배열에서 랜덤하게 지정하여 재생하는 기능을 맡는다.

 

위처럼 코드를 작성하면 Scene이 로드되면 랜덤한 BGM을 재생한다.

 

24.05.21 Today I Learned