【Unity】Audio Mixerでサウンドをカテゴリ化して音量を管理する

Unity の Audio Mixer でサウンドをカテゴリ化して管理する方法についてまとめました。

はじめに

Audio Mixer の Audio Group を使うと、いくつかのサウンドをグループ化して、グループごとにエフェクトなどを適用することができます。
これを使うとサウンドを SE、ボイス、BGM などのカテゴリに分けて、カテゴリごとに音量を管理するといったことが実現できます。

本記事ではこれを行う方法についてまとめます。

なお Audio Mixer の基本的な使い方については以下の記事にまとめていますので、必要に応じて参照してください。

light11.hatenadiary.com

Audio Groupを作成する

まずカテゴリごとの Audio Group を作成します。
Audio Group を作るには、右側のパネルの Groups の Masterを選択した状態で + ボタンを押下します。
以下の例では BGM という名前のグループを作成しています。

BGMグループ

同様に Voice、SE という名前のグループを作成しておきます。

Voice,SE

Audio Source と Audio Group を紐づける

次に Audio Source と Audio Group を紐づけます。
Audio Source の Inspector から Output プロパティに前節で作成した Audio Group をアサインします。
以下では BGM01 を再生する Audio Source に BGM グループが紐づいています。

AudioSourceと紐付け

Audio Groupの音量を調整する

このようにして Audio Group に紐づけた Audio Source は、Audio Group に設定した音量で再生されます。
グループごとの音量はGUI上から設定することができます。

音量調整

スクリプトでグループごとの音量を調整するには、まず該当するパラメータを Exposed Parameter に設定します。
今回は各グループの Inspector から Attenuation > Volume を右クリックし、 Expose ‘Volume (of [グループ名])’ to script を選択します。

Expose

すると Audio Mixer の右上に Exposed Parameter が一つ追加されます。
これはわかりやすい名前に右クリックメニューから適宜リネームしておきます。

リネーム

他のグループの Volume に関しても同様に Exposed Parameter にしておきます。

あとはスクリプトから AudioMixer.SetFloat() でこのパラメータに値を設定すれば、グループの音量が変更できます。
以下は一つのグループの音量を Inspector で設定した値に変更するコンポーネントです。

using UnityEngine;
using UnityEngine.Audio;

public sealed class Example : MonoBehaviour
{
    [SerializeField] private AudioMixer _audioMixer;
    [SerializeField] private string _volumeParamName;
    [SerializeField] private float _volume;

    private float _currentVolume = -1.0f;

    private void Update()
    {
        if (Mathf.Approximately(_currentVolume, _volume))
            return;
        
        // AudioMixer.SetFloat で Exposed Parameter を設定する
        _audioMixer.SetFloat(_volumeParamName, _volume);
        _currentVolume = _volume;
    }
}

このスクリプト適当な GameObject にアタッチして Audio Mixer をアサインし、Volume Param Name に制御したい Exposed Parameter の名前を入力します。
再生後、Volume の値を変えることで該当するグループの音量が変わることを確認できます。

音量が変わることを確認

なおこの Volume の単位は元のプロパティそのまま(dB)なので、よりユーザが直感的に操作できる様にするには以下のスレッドで話されているような対応をするべきです。

forum.unity.com

Audio Group は入れ子にできる

ちなみに Audio Group は入れ子にすることができます。
下図は Voice の子として Player VoiceEnemy Voice を追加した例です。

入れ子

この様に親子関係を組むと親に適用した変更が子に伝播する様になります。
例えばこの例では、Voice グループの音量を小さくすると Player Voice と Enemy Voice 両方のグループの音量が下がります。

関連

light11.hatenadiary.com

参考

forum.unity.com