サウンドのオプション機能

市販のゲームには大体音量を調整する機能がついています。

効果音、BGM、ボイスで個別に音量設定できたりしますが、

UnityでもAudioMixerを使用して実現することが出来ます。

AudioMixerを用意する

UnityEditorのメニューから

AssetsCreateAudio Mixer と選択し、AudioMixerを作成します。

各種サウンドグループを追加する

UnityEditorのメニューから

WindowAudioAudio Mixer と選択するとAudioMixerウィンドウを開くことが出来ます。

前段で作成したAudioMixerを選択するとその内容がAudioMixerウィンドウに表示されます。

左側のGroups の右にある+ボタンを押すとサウンドグループを追加することが出来ます。

Masterを選択した状態で、サウンドグループを三つ追加し、

それぞれ、SeBgmVoiceとします。

AudioSourceとサウンドグループを関連付ける

AudioClipの再生に使用するAudio Source には、OutputAudioMixerのサウンドグループを設定できます。

以下の様にした場合、Seグループの影響を受けることになります。

サウンドグループの音量をスクリプトから設定できるようにする

AudioMixer上でサウンドグループを選択します(今回はSe)

インスペクタ上のVolume ラベルの辺りを右クリックするとポップアップメニューが表示されるので

「Expose ‘Volume (of Se)’ to script」を選択します。

選択後は、Volume ラベルの横に矢印が表示されます。

パラメータに名前をつける

AudioMixerウィンドウに戻ると右上にExposed Parametersと表示されているので、

クリックすると仮の名前がついているのが分かります。

これだと分かりにくいので、MyExposedParamをダブルクリックし、

わかりやすい名前に変更しましょう。

今回はSeの音量なので、SeMasterVolumeとしておきます。

スクリプトから音量を設定する

AudioMixerSetFloat メソッドに先ほどつけた名前を指定すると、

サウンドグループの音量を変更できます。

ここで指定する音量のは、0.0〜1.0の値ではなく、デシベル(dB)になります。

_mixer.SetFloat(SeVolumeName, ToDecibel(volume));

デシベル(dB)に変換する

デシベルとは?

ゲーム内で音量を設定する際、スライダーで0.0〜1.0の間で調整すると思いますが、

AudioMixerへはデシベルに変換して渡す必要があります。

このようなメソッドを用意してやれば変換できます。

/// <summary>
/// 音量をデシベルに変換
/// </summary>
/// <param name="volume">音量(0.0 - 1.0)</param>
/// <returns>デシベル(-80dB - 0dB)</returns>
private float ToDecibel(float volume)
{
    return Mathf.Clamp(Mathf.Log10(volume) * 20f, -80f, 0f);
}

実際に反映してみる

GameView上のスライダーを変更すると、Seの音量を変更するようにしてみました。

AudoMixer上のSeの音量が変化しているのが確認できます。

ゲーム中のオプション画面でBgmの音量を変更した場合は、裏で流れているBgmで音量の変化をすぐに感じることが出来ます。

効果音の場合そうはいかないので、音量変更後に汎用的な効果音(決定音など)をならしてやると

分かりやすいかもしれません。

アプリ起動時に音量を変更できない

検証中に躓いたのですが、

アプリの起動時にAwakeメソッドからボリューム変更を試みた場合、うまくいきませんでした。

Start メソッド以降のタイミングなら大丈夫でした。