사이드뷰 게임에서는 씬이 바뀔때 마다 BGM을 처음부터 재생했습니다. 이번 예제에서는 씬이 바귀어도 게임이 이어지기 때문에 타이틀화면, 게임화면, 보스전등에서만 BGM이 바뀌도록 합니다.

게임 클리어, 게임오버, 활을 쏠때만 SE(사운드이펙트)를 적용합니다. 예제에서는 버튼이 눌릴때 문이열릴때 문이 닫힐대 아이템을얻을때 대미지를 받을때 적 사망,보스사망등 다양한 곳에 SE를 적용했습니다.

 

사운드 재생 오브젝트와 스크립트 만들기

하이라키에 빈오브젝트를 만들고 이름을 SoundManager라고 합니다.  SoundManager스크립트를 만들어 하이라키의 SoundManager게임오브젝트에 어태치합니다. 

AddComponent로 Audio Source를 추가하고 Play On Awake 체크해제하고 Loop는 체크합니다. BGM제어는 나중에 스크립트에서 제어합니다. Audio 클립은 비워둡니다.

 

씬이 바뀌어도 BGM이 끊어지지 않게 재생한다.

 

씬이 바뀌어도 BGM이 끊어지지 않게 재생하려면 SoundManager가 같은 게임 오브젝트로 존재해야 합니다.

열거형

public enum BGMType
{
    None,       //없음
    Title,      //타이틀
    InGame,     //게임 중
    InBoss,     //보스전
}
//SE 종류
public enum SEType
{
    GameClear,  //게임 클리어
    GameOver,   //게임 오버
    Shoot,      //활 쏘기
}

변수

public AudioClip bgmInTitle;    //타이틀 BGM
public AudioClip bgmInGame;     //게임 중 BGM
public AudioClip bgmInBoss;     //보스전 BGM

public AudioClip meGameClear;   //게임 클리어
public AudioClip meGameOver;    //게임 오버
public AudioClip seShoot;       //활 쏘기

static 변수

씬이 바뀌어도 값이 변화되지 않게 static변수를 마련합니다. 자신을 저장하는 soundManager와 재생중이 BGMType을 저장합니다.

public static SoundManager soundManager;    //첫 SoundManager를 갖는 변수
public static BGMType plyingBGM = BGMType.None;    //재생 중인 BGM

Awake()

Start()보다 앞에서 호출되는  Awake()에서 이전에 실행되었던 soundManager가 있으면 정리합니다.

게임이 실행되고 맨처음 SoundManager가 실행되면 soundManager변수는null입니다. 그때 DontDestroyOnLoad메서드를 호출해 게임 오브젝트가 파기되지 않도록 합니다. soundManager변수는 static이므로 씬이 바뀌어도 값이 유지됩니다.

DontDestroyOnLoad(gameObject)를 이용 씬이 바뀌어도  

private void Awake()
{
    //BGM 재생
    if (soundManager == null)
    {
        soundManager = this;  //static 변수에 자기 자신을 저장
        //씬이 바뀌어도 게임 오브젝트를 파기하지 않음
        DontDestroyOnLoad(gameObject);
    }
    else
    {
        Destroy(gameObject);//게임 오브젝트르 파기
    }
}

PlayBgm()

플레이할 BGM타입이 다르면 AudioSource컴포넌트를 이용해 오디오 클립의 이름을 바꿔서 Play()합니다.

public void PlayBgm(BGMType type)
{
    if (type != plyingBGM)
    {
        plyingBGM = type;
        AudioSource audio = GetComponent<AudioSource>();
        if (type == BGMType.Title)
        {
            audio.clip = bgmInTitle;    //타이틀
        }
        else if (type == BGMType.InGame)
        {
            audio.clip = bgmInGame;     //게임 중
        }
        else if (type == BGMType.InBoss)
        {
            audio.clip = bgmInBoss;     //보스전
        }
        audio.Play();
    }
}

StopBgm()

BGM을 정지합니다. 

public void StopBgm()
{
    GetComponent<AudioSource>().Stop();
    plyingBGM = BGMType.None;
}

SEPlay(SEType type)

상황에 맞는 사운드 이펙트를 재생합니다.

public void SEPlay(SEType type)
{
    if (type == SEType.GameClear)
    {
        GetComponent<AudioSource>().PlayOneShot(meGameClear);   //게임 클리어
    }
    else if (type == SEType.GameOver)
    {
        GetComponent<AudioSource>().PlayOneShot(meGameOver);   //게임 오버
    }
    else if (type == SEType.Shoot)
    {
        GetComponent<AudioSource>().PlayOneShot(seShoot);       //활 쏘기
    }
}

+ Recent posts