オプション画面のボリューム設定に関するプラクティス


アジェンダ

はじめに

オプション画面でサウンドのボリュームを変更できるゲームは多いと思います。
しかし、ゲームによっては、ボリュームの調整がしにくいゲームがあります。
例えば、ボリューム変更時にテストサウンドが再生されなかったりして、どれくらいのボリュームになっているのかよくわからない場合があります。
本記事では、オプション画面のボリューム設定に関するプラクティスを紹介します。

テストサウンドを再生する

ボリュームを変更したときに、そのカテゴリのテストサウンドを再生しましょう。
ユーザーは、それを頼りにボリュームを調整します。
ただし、マウスカーソルやタッチパネルでの操作の場合、ドラッグ中に毎回テストサウンドが再生されると鬱陶しいので、マウスボタンや指を離したときだけ再生されるようにします。

オプション画面でBGMが再生されている場合は、マスターボリューム、BGMボリュームにはテストサウンドは必要ありません。

現在値を表示する

現在のボリュームの数値を表示しましょう。
現在値は、ユーザーのヒントになります。

ss00

目盛りを表示するのも有効です。
特に、0~10の11段階などの場合は、目盛り、最小値、最大値を表示すると親切です。

初期値を最大値の50%~80%程度にする

初期値は最大値の50%~80%程度にしましょう。
ユーザーによっては、ボリュームをデフォルトよりもさらに大きくしたいかもしれません。

ss01

ラウドネスを考慮する

現在値を半分にしたときに、ボリュームが10dB下がるようにしましょう。

ボリュームのスライダーを調整して半分にしても「あれ? 音量が半分になってないな」と思うゲームがあります。
これはなぜかというと、音声の波形の振幅を0.5倍にする実装になっており、これだと人間の耳で聞いたときに音量が半分に聞こえないからです。
adx2, Wwiseのボリューム設定インタフェースは単に振幅に倍率をかけるだけです。
UnityのAudioMixerを使う場合も、スライダーの値の0~1をそのままデシベルに変換して設定することが多く、これも結局振幅に倍率をかけるだけの実装になっています。
そこで、人間の耳で聞いたときに正しい倍率に聞こえるようなボリューム設定の実装を紹介します。

理論

人間の耳で聞いたときに感じる音量の指標をラウドネスといいます。
ラウドネスによると、同じ周波数の音の場合、10dB高ければ聴感上の音量が2倍になり、10dB低ければ聴感上の音量が半分になります。
つまり、スライダーの値を半分にしたときに10dB低くなるようにすればいいわけです。

スライダーの現在値をvoptとすると、まず、式(1)を適用します。

式1

式(1)を適用するとvopt=1のときvdb=0, vopt=0.5のときvdb=-10, vopt=0.25のときvdb=-20になります。
これをそのままデシベルの値として利用できるので、式(2)でデシベルからボリュームに変換します。

式2

ただし、vopt=0のときv=0とします。
このvがラウドネスを考慮したボリュームです。
vをオーディオミドルウェアのSetVolumeで設定します。
AudioMixerの場合はデシベルを設定するので、式(1)の値を直接設定します。

実装

voptを引数として、vが返却される関数をC#で実装しました。

/// <summary>
/// ラウドネスを考慮したボリュームを計算して取得
/// </summary>
/// <param name="volLvRatio">ボリュームレベル比率 (0.0-1.0)</param>
/// <returns>ラウドネスを考慮したボリューム (0.0-1.0)</returns>
public static float CalcGetVolume(float volLvRatio)
{
    if (volLvRatio <= 0.0f)
    {
        return 0.0f;
    }
    else if (volLvRatio >= 1.0f)
    {
        return 1.0f;
    }
    else
    {
        return Mathf.Pow(10.0f, -Mathf.Log(1.0f / volLvRatio, 2.0f) / 2.0f);
    }
}

オプションのボリューム設定が0~1なら、引数には現在値をそのまま入れてください。
オプションのボリューム設定が0~10の11段階で、現在値が10段階中8なら、引数には8/10=0.8を入れてください。

https://github.com/Manicreator/VolumeOptions
GitHubに今回作成したサンプルのソースコード一式を上げましたので、ご参考ください。
このサンプルではAudioMixerを使っていますが、SoundManager.SetVolumeの引数をデシベルにするのは扱いづらいので、二度手間になりますが、CalcGetVolumeで計算したのちに再度デシベルに変換するようにしています。

CalcGetVolumeの引数と返り値の対応表は以下になるので、オプションのボリューム設定が0~10の11段階などの場合は、あらかじめテーブルを作成すると処理が削減できます。

volLvRatio  volume  db
0.00f       0.000f     -inf[dB]
0.05f       0.007f  -43.219[dB]
0.10f       0.022f  -33.219[dB]
0.15f       0.043f  -27.370[dB]
0.20f       0.069f  -23.219[dB]
0.25f       0.100f  -20.000[dB]
0.30f       0.135f  -17.370[dB]
0.35f       0.175f  -15.146[dB]
0.40f       0.218f  -13.219[dB]
0.45f       0.265f  -11.520[dB]
0.50f       0.316f  -10.000[dB]
0.55f       0.370f   -8.625[dB]
0.60f       0.428f   -7.370[dB]
0.65f       0.489f   -6.215[dB]
0.70f       0.553f   -5.146[dB]
0.75f       0.620f   -4.150[dB]
0.80f       0.690f   -3.219[dB]
0.85f       0.763f   -2.345[dB]
0.90f       0.839f   -1.520[dB]
0.95f       0.918f   -0.740[dB]
1.00f       1.000f    0.000[dB]

おわりに

本記事では、オプション画面のボリューム設定に関するプラクティスを紹介しました。
私はどのゲームでもまず最初にボリューム調整をします。
ですが、ボリューム調整しにくいゲームはそれなりに多く、もやもやしたままゲームを開始することが多々あります。
なので、この方法が広まって、すっきりとゲームを開始させてほしい、という思いからこの記事を書きました。
今回紹介したプラクティス一つひとつは、それほど大変な作業ではありませんので、ぜひともご検討よろしくお願いいたします。

参考文献

© 2020 Manicreator