【Unity(C#)】AudioMixer로 앱내의 음량을 BGM, SE등으로 그룹 나누어 조작한다

소개



아래 트윗 동영상과 같은 배경 음악, SE 등을 쉽게 변경할 수있는 구현 방법을 가르쳐 주었으므로 메모합니다.

지금은 이런 Audio 관련 구현의 메모를 기사화하고 있습니다🙆‍♂️ 피 c. 라고 r. 코 m / 1 톤 x09 말하는 J — KENTO⚽️XR 엔지니어😎Shader100 기사 마라톤 도전 중


버전 정보




















여러분의 이름버전
Unity2020.3.4f1
UniRx7.1.0


구현



대략적인 흐름으로서는 아래와 같습니다.



① 믹서를 만든다.

② Mixer 내에서 "SE", "BGM"등의 Group을 정의한다.

③ AudioSource에 Mixer의 Group을 할당한다.

④ Slider의 값을 Mixer의 Group에 건네준다.



①Mixer 만들기



우선 AudioMixer를 엽니다. Window -> Audio -> AudioMixer 의 순서입니다.

September 26, 2021



미설정의 경우 아래와 같은 상태입니다.
를 눌러 믹서를 만듭니다.



작성하면 아래와 같은 화면이 됩니다. 믹서에 적절한 이름을 지정할 수 있습니다.



②Mixer 내에서 "SE", "BGM"등의 Group을 정의한다



Groups Master를 선택한 상태에서 를 눌러 새 Group을 정의할 수 있습니다.





그러면 Group의 Volume을 매개변수로 Script 측에 게시하는 설정을 합니다.

임의의 Group을 선택한 상태에서 Volume 매개변수를 마우스 오른쪽 버튼으로 클릭합니다.
Exposed Volume to script를 선택하면 Volume 옆에 화살표 표시가 나타납니다.



이제 Script 측에서 조작이 가능합니다.

그리고는, 호출할 때의 파라미터명을 임의의 캐릭터 라인으로 변경합니다.

AudioMixer 탭의 오른쪽 상단에 있는 ExposedParameters에서 변경할 수 있습니다.





SE로 변경하면 Script측에서 임의의 함수의 인수에 "SE"를 건네주는 것으로 값을 참조할 수 있습니다.



③ AudioSource에 Mixer의 Group을 할당한다.



AudioSource에 있는 output 의 설정 항목에 방금 작성한 Group을 설정합니다.



④ Slider의 값을 Mixer의 Group에 전달



여기에서 Script 측에서 Mixer 값을 변경할 준비가 완료되었습니다.

그리고는 코드로 Slider의 값을 Mixer에 건네주면 OK입니다.



using UniRx;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

/// <summary>
/// ボリュームの設定
/// </summary>
public class VolumeSettings : MonoBehaviour
{
    /// <summary>
    /// Mixer
    /// </summary>
    [SerializeField] private AudioMixer _mixer;

    /// <summary>
    /// MasterVolumeのスライダー
    /// </summary>
    [SerializeField] private Slider _masterVolumeSlider;

    /// <summary>
    /// BGMのスライダー
    /// </summary>
    [SerializeField] private Slider _bgmSlider;

    /// <summary>
    /// SEのスライダー
    /// </summary>
    [SerializeField] private Slider _seSlider;

    /// <summary>
    /// インスタンス
    /// </summary>
    private static VolumeSettings _instance;

    void Awake()
    {
        if (_instance == null)
        {
            _instance = this;
            DontDestroyOnLoad (gameObject);
        }
        else 
        {
            Destroy (gameObject);
        }
    }

    private void Start()
    {
        //================================
        // Sliderの値をMiserへ
        //================================

        SetSliderValueToMixer("Master", _masterVolumeSlider);
        SetSliderValueToMixer("BGM", _bgmSlider);
        SetSliderValueToMixer("SE", _seSlider);
    }

    /// <summary>
    /// 0 ~ 1の値をdB( デシベル )に変換
    /// </summary>
    /// <param name="volume">ボリューム</param>
    /// <returns>変換後のデシベル</returns>
    private float ConvertVolume2dB(float volume) =>
        Mathf.Clamp(20f * Mathf.Log10(Mathf.Clamp(volume, 0f, 1f)), -80f, 0f);

    /// <summary>
    /// Sliderの値をMixerに設定
    /// </summary>
    /// <param name="groupName">グループ名</param>
    /// <param name="slider">値を通知するスライダー</param>
    private void SetSliderValueToMixer(string groupName,Slider slider)
    {
        slider.OnValueChangedAsObservable()
            .Subscribe(value => _mixer.SetFloat(groupName, ConvertVolume2dB(value)))
            .AddTo(this);
    }
}



Mixer의 값은 데시벨이므로 0~1로 변환하는 함수를 준비하고 있습니다.

(아래 링크에서 빌렸습니다. 압도적 감사!)

【참고 링크】:



결론



선구자에게 부드럽게 구현할 수 있었습니다. 가르쳐 주셔서 감사합니다.



이번 구현을 한 게임을 공개하고 있으므로 좋으면 놀아보세요.

Unity AudioMixer에서 음량 등의 파라미터를 스크립트에서 조작할 때의 포인트 메모


좋은 웹페이지 즐겨찾기