以下の内容はhttps://bluebirdofoz.hatenablog.com/entry/2025/05/05/231009より取得しました。


Unityでアプリの音量をAudioMixerを使って一括制御する

本日は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と同じ設定を行う必要があります。




以上の内容はhttps://bluebirdofoz.hatenablog.com/entry/2025/05/05/231009より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14