5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Unity(C#)】AudioMixerでアプリ内の音量をBGM、SEなどにグループ分けして操作する

Posted at

はじめに

下記ツイートの動画のようなBGM、SEなどを簡単に変更できる実装方法を教えてもらったのでメモします。

バージョン情報

諸々名前 バージョン
Unity 2020.3.4f1
UniRx 7.1.0

実装

大まかな流れとしては下記です。

①Mixerを作成する。
②Mixer内で”SE”、”BGM”などのGroupを定義する。
③AudioSourceにMixerのGroupを割り当てる。
④Sliderの値をMixerのGroupに渡す。

①Mixerを作成する

まずはAudioMixerを開きます。Window -> Audio -> AudioMixerの順です。
Chu1.png

未設定の場合、下記のような状態です。
を押下してMixerを作成します。
Chu2.png

作成すると下記画面となります。Mixerに適当な名前を付けることができます
Chu3.png

②Mixer内で”SE”、”BGM”などのGroupを定義する

GroupsのMasterを選択した状態でを押下することで新しいGroupを定義できます。

Chu4.png

次にGroupのVolumeをパラメータとしてScript側に公開する設定をします。
任意のGruopを選択した状態でVolumeのパラメータ上で右クリックをします。
Exposed Volume to scriptを選ぶことでVolumeの横に矢印マークが出ます。
Chu11.gif

これでScript側から操作が可能になりました。
あとは、呼び出す際のパラメータ名を任意の文字列に変更します。
AudioMixerタブの右上にあるExposedParametersから変更可能です。

Chu5.png

SEに変更するとScript側で任意の関数の引数に"SE"を渡すことで値を参照できます。
Chu6.png

③AudioSourceにMixerのGroupを割り当てる

AudioSourceにあるoutputの設定項目に先ほど作成したGruopを設定します。
Chu12.gif

④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で音量等のパラメータをスクリプトから操作する際のつまりポイントメモ

おわりに

先駆者のおかけでスムーズに実装できました。教えてくださった方ありがとうございます。

今回の実装を施したゲームを公開しているので良かったら遊んでみてください。
逃走中 In AMERICA

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?