쯔꾸르식 유니티 게임 공부

09.BGM매니져(배경음)

ruripanda 2025. 1. 3. 17:07

using System.Collections;
using UnityEngine;

public class BGMManager : MonoBehaviour
{
    static public BGMManager instance;

    public AudioClip[] clips;//배경음악 칩

    public AudioSource source;

    public WaitForSeconds waitTime = new WaitForSeconds(0.01f);

    private void Awake()
    {
        if (instance == null)
        {
            DontDestroyOnLoad(this.gameObject);
            instance = this;
        }
        else
        {
            Destroy(this.gameObject);
        }
    }

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        source = GetComponent<AudioSource>();
    }

    public void Play(int _playMusicTrack)//플레이
    {
        source.volume = 1f;
        source.clip = clips[_playMusicTrack];
        source.Play();
    }

    public void SetVolumn(float _volumn)//볼륨조절
    {
        source.volume = _volumn;
    }

    public void Pause()//일시정지
    {
        source.Pause();
    }

    public void UnPause()//일시정지 해제
    {
        source.UnPause();
    }

    public void Stop()//정지
    {
        source.Stop();
    }

    public void FadeOutMusic()//서서히 볼륨내리기
    {
        StopAllCoroutines();
        StartCoroutine(FadeOutMusicCoroutine());
    }

    IEnumerator FadeOutMusicCoroutine()
    {
        for(float i = 1.0f; i >= 0f; i -= 0.01f)
        {
            source.volume = i;
            yield return waitTime;
        }
    }

    public void FadeInMusic()//서서히 볼륨 올리기
    {
        StopAllCoroutines();
        StartCoroutine(FadeInMusicCoroutine());
    }

    IEnumerator FadeInMusicCoroutine()
    {
        for (float i = 0f; i <= 1f; i += 0.01f)
        {
            source.volume = i;
            yield return waitTime;
        }
    }
}
using UnityEngine;

public class TestScripts1 : MonoBehaviour
{
    BGMManager BGM;

    public int playMusicTrack;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        BGM = FindAnyObjectByType<BGMManager>();
    }

    void OnTriggerEnter2D(Collider2D collision)
    {
        BGM.Play(playMusicTrack);
    }
}
using System.Collections;
using UnityEngine;

public class TestScripts2 : MonoBehaviour
{
    BGMManager BGM;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        BGM = FindAnyObjectByType<BGMManager>();
    }

    void OnTriggerEnter2D(Collider2D collision)
    {
        StartCoroutine(abc());
        this.gameObject.SetActive(false);
    }

    IEnumerator abc()
    {
        BGM.FadeOutMusic();

        yield return null;
    }
}

 

BGMManager 스크립트를 작성한다

이 스크립트 역시 인스턴스가 사라지면 안되기 때문에 void Awake()에 인스턴스를 만들어 준다

그리고 위 스크립트를 보면 윗 부분에

public WaitForSeconds waitTime = new WaitForSeconds(0.01f);

부분이 있는데 코루틴으로 정지하는 코드를 코루틴마다 0.01f라는 식으로 막 적어놓으면 이 값마저 복제되므로

이 값을 아예 정해주자

빨간색 화살표는 오디오를 재생할 컴포넌트 오디오 소스고

파란색 화살표는 재생할 BGM을 슬롯에 넣은 것이다

BGM을 실감나게 사용하기 위해 볼륨을 서서히 내리는 것과 볼륨을 서서히 올리는 것을 구현해놨다

코루틴이 사용되었으며 페이드인과 아웃할때 코루틴을 정지해야 하므로

StopAllCorutine()를 이용하여 모든 코루틴을 정지하는 기능을 넣었다

 

 

 

테스트를 위해서 빈 객체에 BoxCollider2D를 만들거 is트리거를 체크한다

그뒤 위에 작성된 TestScritps1을 넣는다

 

 

테스트 스크립트의 변수와 인스팩터이다

public int playMusicTrack가 int로 0이냐 1이냐에 따라서 재생되는 곡이 바뀐다

이 스크립트의 경우 빈 오브젝트를 발판 삼아서 캐릭터가 위에 올라 밟으면 재생되게 했다

 

스크린샷 밖에 못 보여주지만 재생이 되고 있다

 

다음은 TestScripts2를 보고 작성해주고 발판을 준비해주자

그리고 테스트를 하면 페이드 아웃이 되면서 음악이 종료된다

그리고 BGMManager의 스크립트를 보면

음악 시작을 이렇게 작성해놓고 맨 첫째줄의 볼륨에 1f를 선언해주었는데

페이드 아웃이 된 후 볼륨을 다시 올려주는 용도이다

이게 없으면 페이드 아웃 후 볼륨이 0인 그대로가 되므로 필요해서 넣었다