サウンドのオプション機能
市販のゲームには大体音量を調整する機能がついています。
効果音、BGM、ボイスで個別に音量設定できたりしますが、
UnityでもAudioMixer
を使用して実現することが出来ます。
AudioMixerを用意する
UnityEditorのメニューから
Assets
→Create
→Audio Mixer
と選択し、AudioMixerを作成します。
各種サウンドグループを追加する
UnityEditorのメニューから
Window
→Audio
→Audio Mixer
と選択するとAudioMixerウィンドウを開くことが出来ます。
前段で作成したAudioMixerを選択するとその内容がAudioMixerウィンドウに表示されます。
左側のGroups
の右にある+ボタンを押すとサウンドグループを追加することが出来ます。
Masterを選択した状態で、サウンドグループを三つ追加し、
それぞれ、Se
、Bgm
、Voice
とします。
AudioSourceとサウンドグループを関連付ける
AudioClip
の再生に使用するAudio Source
には、Output
にAudioMixer
のサウンドグループを設定できます。
以下の様にした場合、Seグループの影響を受けることになります。
サウンドグループの音量をスクリプトから設定できるようにする
AudioMixer
上でサウンドグループを選択します(今回はSe
)
インスペクタ上のVolume
ラベルの辺りを右クリックするとポップアップメニューが表示されるので
「Expose ‘Volume (of Se)’ to script」を選択します。
選択後は、Volume
ラベルの横に矢印が表示されます。
パラメータに名前をつける
AudioMixer
ウィンドウに戻ると右上にExposed Parameters
と表示されているので、
クリックすると仮の名前がついているのが分かります。
これだと分かりにくいので、MyExposedParam
をダブルクリックし、
わかりやすい名前に変更しましょう。
今回はSeの音量なので、SeMasterVolume
としておきます。
スクリプトから音量を設定する
AudioMixer
のSetFloat
メソッドに先ほどつけた名前を指定すると、
サウンドグループの音量を変更できます。
ここで指定する音量のは、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
メソッド以降のタイミングなら大丈夫でした。