本日はUnityの小ネタ枠です。
Unityでアプリの音量をAudioMixerを使って一括制御する方法です。
AudioSource
UnityではAudioSourceコンポーネントを使って任意の音源を再生します。
本コンポーネントのvolumeプロパティを走査することで音量を変更できます。
またmuteプロパティをTrueにすることで即座に消音することもできます。
docs.unity3d.com
// 音量(0~1)を最大にする audioSource.volume = 1.0f; // 消音を有効にする audioSource.mute = ture;
AudioMixer
AudioMixerは複数の音源をまとめて制御するための仕組みです。
複数のAudioSourceをグループ化してまとめて消音したりできるようになります。
docs.unity3d.com
AudioMixerを利用して複数の音源を制御する
実際にAudioMixerを利用して複数の音源を制御するサンプルシーンを作成してみます。
AudioMixerを作成する
AudioMixerを利用するにはAssetsフォルダで右クリックから[Create -> Audio Mixer]を実行します。

これでmixerファイルが作成されます。

mixerファイルはAudio Mixerウィンドウで編集を行います。
メニューから[Widion -> Audio -> Audio Mixer]を選択してウィンドウを開きます。

mixerファイルを選択するとAudio Mixerウィンドウで内容を確認できます。

[Group]欄で音源を制御するグループを作成できます。
今回はMasterグループの子グループとして更にMusicとSEグループを作成しました。

AudioMixerのグループとAudioSourceを関連付ける
次にAudioMixerのグループとAudioSourceを関連付けます。
サンプルシーンにMusicとSEの2つのAudioSourceを作成しました。

AudioSourceコンポーネントの[Output]プロパティでAudioMixerのグループを指定します。
MusicのAudioSourceにはMusicグループを関連付けました。

SEのAudioSourceにはSEグループを関連付けました。

AudioMixerをスクリプトから操作する
今回はAudioMixerをスクリプトから操作したいので追加で設定を行います。
再びAudio Mixerウィンドウを開き、操作したいグループを選択します。今回はMasterグループを操作します。

Inspectorビューからスクリプトから操作したい[Volume]プロパティを右クリックします。
[Expose 'Volume (of Master)' to script]を実行します。

[Exposed Parameters]の項目が追加されます。
このパラメータを通してスクリプトから設定を操作することができます。

そのままだと名前が分かりづらいので、項目をダブルクリックして分かりやすい名前に変更しておきます。

これでスクリプトからは以下のコードでプロパティにアクセスできるようになります。
AudioMixer audioMixer = GetComponent<>(AudioMixer); // 以下でプロパティを取得する audioMixer.GetFloat("MasterVolume", out float masterDecibel); // 以下でプロパティを設定する audioMixer.SetFloat("MasterVolume", masterDecibel);
サンプルスクリプト
スライダーでMaster音源の音量を調整する以下のサンプルスクリプトを作成しました。
・VolumeSettingController.cs
using UniRx; using UnityEngine; using UnityEngine.UI; using TMPro; using UnityEngine.Audio; namespace MainMenu.Settings.VolumeMenu.Scripts { public class VolumeSettingController : MonoBehaviour { [SerializeField] private AudioMixer audioMixer; [SerializeField] private Toggle onoffToggle; [SerializeField] private Slider volumeSlider; [SerializeField] private TMP_Text volumeText; void Start() { // 現在のMaster音量を取得する audioMixer.GetFloat("MasterVolume", out float masterDecibel); float currentVolume = DecibelToLinear(masterDecibel); // ON/OFF Toggleの状態を設定する onoffToggle.isOn = !(currentVolume <= 0.0f); // スライダーの状態を設定する volumeSlider.value = currentVolume; volumeText.text = $"{currentVolume * 100:F0}%"; // Toggleのイベントリスナーを追加する onoffToggle.onValueChanged.AsObservable() .Subscribe(isOn => { if (isOn) { // 音量の設定が0の場合、スライダーを50%にする if (volumeSlider.value <= 0.0f) { volumeSlider.value = 0.5f; // スライダーの値を更新 } } else { // 音量の設定が0以外の場合、音量をスライダーを0にする if (volumeSlider.value > 0.0f) { volumeSlider.value = 0.0f; // スライダーの値を更新 } } }) .AddTo(this); // スライダーのイベントリスナーを追加する volumeSlider.onValueChanged.AsObservable() .Subscribe(value => { // 音量をデシベルに変換してAudioMixerに設定する float decibel = LinearToDecibel(value); audioMixer.SetFloat("MasterVolume", decibel); // AudioMixerに音量を設定 volumeText.text = $"{value * 100:F0}%"; // 音量が0の場合、ToggleをOFFにする bool isVolumeOn = (value > 0.0f); if (isVolumeOn != onoffToggle.isOn) { onoffToggle.isOn = isVolumeOn; // Toggleの状態を更新 } }) .AddTo(this); } // 音量(0.0~1.0)をデシベルに変換する private float LinearToDecibel(float linear) { if (linear <= 0.0f) return -80.0f; // -80dBは無音 return 20.0f * Mathf.Log10(linear); } // デシベルを音量(0.0~1.0)に変換する private float DecibelToLinear(float decibel) { if (decibel <= -80.0f) return 0.0f; // 無音 return Mathf.Pow(10.0f, decibel / 20.0f); } } }
サンプルスクリプトのaudioMixerプロパティにmixerファイルの参照を設定します。

シーンを再生してスライダーを操作します。

MasterグループはMusicとSEの親グループなので両方の音量が合わせて変更できます。
MusicとSEグループをそれぞれ設定したい場合は別途Masterと同じ設定を行う必要があります。
