【Unity】AudioMixerを使ってスクリプトから音量を調整する

  • URLをコピーしました!
目次

はじめに

Twitterでアプリ側で音量調整がしたいかどうかアンケートを取りました。調整したいという票が多かったので実装することにしました。その時のまとめです。

多少バイアスを考慮したとしても意外な結果でした…

仕様

アンケート結果からすると、音量調整はオン・オフできるだけでも良いと思いましたが、せっかくなので「Slider」を使ってBGMとSEを調整できるようにしてみます。さらに音量調整はステップがある方が個人的に好みなので5段階調整にしてみます。

手順

Audio Mixerを準備する

  • Projectで右クリックしてCreateからAudio Mixerを作成して「GameAudio」など名前を変更します。
  • 「GameAudio」を選択したままWindowAudioからAudio Mixerを選択してウインドウを開きます。
  • Groups+を押してMasterの階層下に「BGM」と「SE」を作成します。

ここまでで画像の状態になっているはずです。

スクリプトからボリュームを調整できるようにする

  • 「BGM」を選択してInspectorの「Volume」部分で右クリックしてExpose 'Volume(of BGM)' to scriptを選択します。
  • Audio Mixerウインドウの右上のExporsed Parametersに「MyExporsedParam」ができるので「BGM」など管理しやすい名前に変更します。

「SE」も同じようにします。

Audio Souceを準備する

  • 適当にゲームオブジェクトを作ってAudio SourceAdd Componentします。
  • OutputAudio Mixerの「BGM」を登録します。

「SE」も同じようにします。

Sliderを準備する

  • HieralchyUI>SliderでSliderを作って「Slider_BGM」などに名前を変更します。
  • SliderMin Valueを「0」、Max Valueを「5」にします。
  • Whole Numbersにチェックを入れます(Valueの値が整数だけに制限されます)

「SE」も同じようにします。

サンプルコード

サンプルコードです。

using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

public class AudioVolume : MonoBehaviour
{
    [SerializeField] AudioMixer audioMixer;
    [SerializeField] Slider bgmSlider;
    [SerializeField] Slider seSlider;

    void Start()
    {
        //スライダーを動かした時の処理を登録
        bgmSlider.onValueChanged.AddListener(SetAudioMixerBGM);
        seSlider.onValueChanged.AddListener(SetAudioMixerSE);
    }

    //BGM
    public void SetAudioMixerBGM(float value)
    {
        //5段階補正
        value /= 5;
        //-80~0に変換
        var volume = Mathf.Clamp(Mathf.Log10(value) * 20f,-80f,0f);
        //audioMixerに代入
        audioMixer.SetFloat("BGM",volume);
        Debug.Log($"BGM:{volume}");
    }

    //SE
    public void SetAudioMixerSE(float value)
    {
        //5段階補正
        value /= 5;
        //-80~0に変換
        var volume = Mathf.Clamp(Mathf.Log10(value) * 20f,-80f,0f);
        //audioMixerに代入
        audioMixer.SetFloat("SE",volume);
        Debug.Log($"SE:{volume}");
    }
}

簡単にコード解説します。

[SerializeField] AudioMixer audioMixer;
[SerializeField] Slider bgmSlider;
[SerializeField] Slider seSlider;

  • 先に作ったAudioMixerとSliderを登録します。

//スライダーを動かした時の処理を登録
bgmSlider.onValueChanged.AddListener(SetAudioMixerBGM);
seSlider.onValueChanged.AddListener(SetAudioMixerSE);

  • Start()でそれぞれのスライダーを動かした時の処理を登録しています。

//BGM
public void SetAudioMixerBGM(float value)
{

  • 先のSliderの設定により受け取る値は「0,1,2,3,4,5」のいずれかになっています。

//5段階補正
value /= 5;

  • 受け取った値を5で除算して0~1の間に丸めます。

//-80~0に変換
var volume = Mathf.Clamp(Mathf.Log10(value) * 20f,-80f,0f);

  • Mathf.Log10(value) * 20fは相対量をdBに変換する式です。
  • Mathf.Clampで「-80~0」の間に収まるようにしています。
私は何から出来ているのか?
音の大きさ・dBデシベル・音圧・A特性とは?Excel計算式・距離・合成和 音の大きさとは 音の大きさというのは、一体どういうことか? 音量とデシベル、音圧、人の感覚としての音の大きさ、そしてA特性などについて説明する。Excel式も示す。 音...

//audioMixerに代入
audioMixer.SetFloat(“BGM”,volume);

  • 取得した値をSetFloatでAudioMixerに代入しています。
  • “BGM”部分は「MyExporsedParam」で変更した名前を入れます。

挙動確認

サンプルコードを適当なゲームオブジェクトに貼り付けて、先に作った「GameAudio」と「Slider_BGM」をInspectorからそれぞれ登録してください。

エディターを実行してSliderを動かし、ボリュームが「-80~0」の間で変化するのを確認してみてください。

あとは見た目を整えて完成です。

あわせて読みたい
【Unity】Sliderを動かした時の挙動をスクリプトから登録する 【はじめに】 タイトルの通りですが「Slider」を動かした時の挙動をスクリプトから登録します。 【サンプルコード】 using UnityEngine; using UnityEngine.UI; public ...

参考

あわせて読みたい
Slider - Unity マニュアル Slider (スライダー) を使うと、ユーザーがマウスをドラッグすることによって所定の範囲から数値を選択できます。これに似た スクロールバー は、数の値を選択するためでな...
快速エンジニア
【Unity】AudioMixerを使った簡単な音量調整 その2 - 快速エンジニア 前の記事AudioMixerの作成とセットアップyumeoimushi.hatenablog.com さて、次にスクリプトからグループの音量を変更するのですがどうすれば良いでしょうか。例えば以下の...

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次