快速エンジニア

駆け出しエンジニア、雑記を書く。Unity多め

【Unity】AudioMixerを使った簡単な音量調整 その2

前の記事AudioMixerの作成とセットアップ

yumeoimushi.hatenablog.com


さて、次にスクリプトからグループの音量を変更するのですがどうすれば良いでしょうか。例えば以下のように書きたいところです。

AudioMixer.音量をセットする関数(BGMグループ, スライダーの値)

では、上の「BGMグループ」のようなグループの識別子であるタグ(パラメータ)を作成します。

まず、先ほどのProjectウィンドウから作成したAudioMixerの子要素(BGM)をインスペクターに開きます。

f:id:tantakotako:20210209215310p:plain

開いたらAttenuationからVolumeと書かれている部分を右クリックし、一番上にある「Expose 'Volume (of SE)' to script」をクリックします。これでパラメータが作成されVolumeをスクリプトから変更できるようになります。

f:id:tantakotako:20210209215630p:plain

作成したパラメータはAudioMixerウィンドウの右上にあるExposed Parameterから確認することができます。MyExposedParam1,2...のように追加されますがそれぞれを右クリックしRenameを選択するとパラメータの名前を変更することができます。BGM,SEなどと変更すると良いでしょう。

f:id:tantakotako:20210209220018p:plain

それではスクリプトを書いていきます。音量をセットする関数はSetFloatというものが用意されているのでこれを使用します。第一引数には先ほど設定したグループの識別子であるパラメータを、第二引数にはスライダーのvalueを入れます。スライダーはここでは解説しないので別途作成しておいてください。

    import UnityEngine.Audio;
...
    public AudioMixer audioMixer;
    public Slider slider;

    public void SetBgmVolume()
    {
        audioMixer.SetFloat("BGM", slider.value);
    }

あとはこのSetBgmVolumeをスライダーのOnValueChangedに登録するだけなのですが、少し困ったことが。
Mixerの方の音量はdb(デシベル)という単位なのですがAudioSourceはv(ボリューム)という単位を使っているため齟齬が生じます。さらにMixerは-80~0の範囲、AudioSourceが0~1の範囲で可変なのでそこでも数値のズレが起きます。
そのため、以下のボリュームからデシベルに変換して0~1の範囲に収める関数を追記してSetFloatの第二引数をslider.valueからConvertVolumeToDb(slider.value)に変更してください。そして、SliderのインスペクターからMinValueを0、MaxValueを1に変更します(Volumeと対応づけた形にする)。

    public float ConvertVolumeToDb(float volume)
    {
        return Mathf.Clamp(Mathf.Log10(Mathf.Clamp(volume, 0f, 1f)) * 20f, -80f, 0f);
    }

    public void SetBgmVolume(float volume)
    {
        audioMixer.SetFloat("BGM",ConvertVolumeToDb( slider.value));
    } 

中身の説明を少しすると、ボリュームをデシベルに変換するにはlog10をとって20をかける必要があります。そもそもデシベルは基準となる音(ボリューム)があってそれが何倍になったかを表す単位です。何倍は比の常用対数の二十倍というように定義がされているのでそうせざるを得ないんですね。ちなみに私はこれを脳科学の講義で習いました(なぜでしょうね)。Clampは第一引数でとった値を第二引数と第三引数の間に収める関数です。0~1の範囲を無理やり-80~0に収めてるわけです。

あとはSetBgmVolumeをスライダーのOnValueChangedに登録しておけばSliderを動かすたびに関数が呼ばれて音を動的に変更出来ます。お疲れ様でした。