Deff_Dev

[Unity/C#] AudioMixer를 이용한 볼륨 조절 본문

Unity(유니티)/유니티 공부

[Unity/C#] AudioMixer를 이용한 볼륨 조절

Deff_a 2024. 6. 26. 01:39

 

게임을 할 때, 게임 설정 창에서 위와 같이 마스터 볼륨, 배경음, 효과음을 슬라이드로 조절하는 것을 볼 수 있을 것이다.

 

 

Audio Source의 Volume을 조절하면 될까 ?

 

그렇게 한다면 배경음과 효과음의 Volume을 조절할 수 있을 것이다.

 

하지만 이 방법으로 구현한다면 게임에 존재하는 모든 Audio Source의 Volume을 조절해줘야 한다.

그리고 마스터 볼륨은 배경음과 효과음 소리의 크기와 같이 조절하는 것이 아니라 따로 독립적으로 조절해야 한다.

즉, 배경음과 효과음 볼륨을 줄이는 것은 게임의 전체적인 소리를 담당하는 것이 아니다.

마스터 볼륨은 게임의 전체적인 소리 출력을 담당하는 기능이기 때문에 배경음과 효과음과는 다른 독립적인 사운드 조절 방식이 필요하다.

 

그럼 어떻게 해야할까 ?

 

유니티에서 제공하는 AudioMixer를 이용하여 각각의 볼륨들을 조절할 수 있다.

 

AudioMixerAudioSources에서 생성하는 오디오 시그널을 더 복잡하게 라우팅하고 믹싱하는 AudioSources를 참조할 수 있는 에셋입니다.

 

이 글에서는 볼륨 조절과 관련된 내용들만 소개하니 더 자세한 내용은 아래 공식 문서를 확인하면 된다.

 

오디오 믹서 및 개념 개요 - Unity 매뉴얼

AudioMixer는 AudioSources에서 생성하는 오디오 시그널을 더 복잡하게 라우팅하고 믹싱하는 AudioSources를 참조할 수 있는 에셋입니다. 에셋의 유저에 의해 생성된 AudioGroup 계층 구조를 통해 믹싱을 기

docs.unity3d.com


오디오 믹서 생성

 

Project → 우클릭   Create 오디오 믹서 생성

 

오디오 믹서를 열게 된다면 Master만 존재하는데, Groups의 +를 눌러 BGM, SFX 그룹을 생성한다.

 

Project에서 Master, BGM, SFX 그룹을 선택한 다음 Volume을 우클릭해서 Expose "Volume (of 이름)" to script를 클릭한다.

 

3개의 그룹을 다 클릭했다면 오디오 믹서로 돌아와 오른쪽 상단의 Exposed Parameters를 누르고 그룹 이름에 맞게 변경해준다.

 

이렇게 설정한 BGMSFX를 원하는 기능의 Audio Source 컴포넌트의 Output에 캐싱한다.


스크립트 작성

더보기
using UnityEngine;
using UnityEngine.Audio;

public enum EAudioMixerType{Master,BGM,SFX}
public class AudioManager : MonoBehaviour
{
	public static AudioManager Instance;
    [SerializeField] private AudioMixer audioMixer;

    private bool[] isMute = new bool[3];
    private float[] audioVolumes = new float[3];
    privatevoid Awake()
    {
       	Instance = this;
    }
  
    public void SetAudioVolume(EAudioMixerType audioMixerType,float volume)
    {
        // 오디오 믹서의 값은 -80 ~ 0까지이기 때문에 0.0001 ~ 1의 Log10 * 20을 한다.
        audioMixer.SetFloat(audioMixerType.ToString(), Mathf.Log10(volume) * 20);
    }

    public void SetAudioMute(EAudioMixerType audioMixerType)
    {
        int type = (int)audioMixerType;
        if (!isMute[type]) // 뮤트 
        {
            isMute[type] = true;
            audioMixer.GetFloat(audioMixerType.ToString(), out float curVolume);
            audioVolumes[type] = curVolume;
            SetAudioVolume(audioMixerType, 0.001f);
        }
        else
        {
            isMute[type] = false;
            SetAudioVolume(audioMixerType,  audioVolumes[type] );
        }
    }
}
private void Mute()
{
    AudioManager.Instance.SetAudioMute(EAudioMixerType.BGM);
}

private void ChangeVolume(float volume)
{
    AudioManager.Instance.SetAudioVolume(EAudioMixerType.BGM,volume);
}

 

슬라이더, 버튼 이벤트 함수

private void Mute()
{
    AudioManager.Instance.SetAudioMute(EAudioMixerType.BGM);
}

private void ChangeVolume(float volume)
{
    AudioManager.Instance.SetAudioVolume(EAudioMixerType.BGM,volume);
}

 

 

AudioManager를 작성하고 Mute 함수를 Button Onclick 이벤트ChangeVolume을 슬라이더의 OnValueChanged 이벤트에 등록한다.

 

이때, 슬라이더의 Min Value를 0.0001로 설정해줘야한다.

 

왜 그럴까 ?

 

오디오 믹서는 -80dB ~ 0dB로 구성되어 있기 때문에 log(value) * 20을 한다.

여기서 Mathf.Log10은 밑이 10인 로그함수를 얘기한다.

 

 

이렇게 설정한 다음 슬라이더와 버튼을 눌러본다면 마스터 볼륨, 효과음, 배경음이 잘 조절되는 것을 알 수 있다.