ゲーム作成の後半、設定画面などで音量のOn/Offなどの設定を行う時に便利な処理です。後半ではスクリプトで制御する方法を紹介します!
AudioMixerを使った音を鳴らす方法
音量調整を行うのが最終目標ですが、そもそもAudioMixerを使って音を鳴らす処理を作って理解を深めましょう。
AudioMixerの作成
プロジェクトビュー右クリックからCreate>Audio Mixerから新しいAudio Mixerを作成します。作成したAudioMixerをダブルクリックするとAudioMixer用のウインドが立ち上がります。このあとはこちらのウインドを使いながら作業を行います。

音ごとにGroupを作成する
AudioMixerウインドの、Groups右側のプラスボタンを押して、新しいグループを作成します。今回はBGMの音量を制御するグループを作ってみます。実際のゲームだとSE用やVoice用があるといいですね。

ここの名前は後でわかりやすいようにちゃんとつけましょう!
AudioSourceにセットする
AudioMixerで作成したグループはAudioSourceにセットすることで真価を発揮します。空のGameObjectにAudioSourceをAdd Componentし、下図を参考にAudio ClipとOutputにBGMをセットしてください。

AudioClipは音がなるものであればなんでもOKです。Play On Awakeにチェックが入っている状態だと、再生することで音がなると思います。ここでは無制御のため普通に鳴ればよし。
実際に音量調整をしてみる
作成したBGMのグループのボリュームを調整してみたいと思います。下図を参考に音量を0~-80の間で調整してください。0がいつも通りで、-80が消音状態になります。わかりやすいのだと-80にして音がならなくなるのを確認すると良いでしょう。

Mのボタンを押すことでミュートにも出来ますが、プログラムから干渉する方法がわかりませんでした。
スクリプトで制御できるようにする
AudioMixerのグループで、音量の制御ができるようになりました。しかし実際にスクリプトで制御するにはもう少し調整が必要になります。
Volume調整用のパラメータを作る
AudioMixerウインドを表示し、BGMを選択します。インスペクタの赤い囲み部分を右クリックすると「Expose ‘Volume (of BGM )’ to script」が表示されますので、それを選択します。

選択できると、AudioMixerウインド右上のExposed Parametersが増えます。追加されたパラメータをダブルクリックなどを行うことで編集が可能になります。ここでは「BGM-Volume」と変更してください。

スクリプトで消音してみる
最初の方でUnityを実行したら音がなる前提でAudioMixerを操作する処理を記載します。下記スクリプトを作成してください。
using UnityEngine;
using UnityEngine.Audio;
public class AudioMixerTest : MonoBehaviour
{
[SerializeField] private AudioMixer audioMixer;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
audioMixer.SetFloat("BGM-Volume", -80f);
}
}
}
作成出来たら空のGameObject(AudioMixerTest)を作成して、スクリプトを貼り付けます。インスペクターに作成済みのAudioMixerをセットしたらゲームを動かしてみてください。左クリックをすると、音が止まります。

この制御の良いところは、AudioSourceなどと制御するスクリプトをインスペクターで紐づける必要がないところです。Projectのアセットに作用させるだけなので、設定画面などが別のシーンにあってもボリューム調整を行うことが可能です。便利だね!
UIスライダーと連携するサンプル
おまけ。UIのスライダーと連携することで、段階的にボリューム調整を行うことが出来ます。
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Audio;
public class SliderVolumeSample : MonoBehaviour
{
[SerializeField] private AudioMixer audioMixer;
[SerializeField] private Slider volumeSlider;
private void Start()
{
if (volumeSlider != null)
{
volumeSlider.onValueChanged.AddListener((value) =>
{
// valueは0~1の値を期待する。それを保証するための処理
value = Mathf.Clamp01(value);
float decibel = 20f * Mathf.Log10(value);
decibel = Mathf.Clamp(decibel, -80f, 0f);
audioMixer.SetFloat("BGM-Volume", decibel);
});
}
}
}
スクリプトの用意が出来たら、AudioMixerTest同様に貼り付けて、インスペクターのセットを行います。VolumeSliderにはUIで作成したSliderをつけてください。設定自体はデフォルトのままのValueが0~1のままを期待します。

セットできたらゲームを動かしてみてスライダーを動かしてみてください。ボリューム調整ができるようになっているはずです!

音量調整で数式が入っているのはデシベルというものを考慮した計算になっているからです。-80~0の値を取りますが、この数字を線形に適応すると結構雑なボリューム調整になります。



だからLog10を使った計算が必要なんですね。
ちょっとした注意点
以下は気がついたら追記していきます。
SetFloatのタイミング
ボリューム調整時、AwakeやOnEnableで消音したくていきなりSetFloatで-80fとかを突っ込んだんですが、なにかの初期化より早いからなのか、適応されませんでした。
Startメソッドだとセーフ。
コメント