AudioMixerサンプルコードの変更点について

Unityにおける音声管理は、ゲーム体験の質を大きく左右します。特にBGM(背景音楽)のボリューム調整は、プレイヤーの没入感を高めるために重要です。今回、AudioMixerを使用してBGMの音量を制御するスクリプトを改善し、より柔軟で効率的な方法を実装しました。以下では、変更前後のコードの違いや新しいクラスBGMSettingsの各部分について詳しく解説します。

変更前のコード

[SerializeField]
AudioMixer audioMixer;

audioMixer.SetFloat("BGMVolume", -20);

var volume = audioMixer.GetFloat("BGMVolume");

このコードでは、AudioMixerをシリアライズフィールドとして宣言し、BGMVolumeというパラメータに対して-20dBを設定し、その後現在のボリュームを取得しています。しかし、このコードにはいくつかの問題点があり、エラーを引き起こす可能性があります。

エラーの原因

GetFloatメソッドの誤用

AudioMixer.GetFloatメソッドは、以下のようなシグネチャを持っています:

public bool GetFloat(string name, out float value); 

このメソッドは、指定したパラメータの値を取得し、その結果をoutパラメータとして返します。また、取得に成功したかどうかをbool値で返します。しかし、変更前のコードではoutキーワードが使用されておらず、戻り値を直接var volumeに代入しようとしています。これはコンパイルエラーの原因となります。

コンテキストの不足

クラスやメソッドの中に含まれていないため、実際の実装ではどのように配置されているか不明です。例えば、SetFloatGetFloatStartメソッドやUpdateメソッド内で呼び出されているかどうかが明確ではありません。

具体的なエラーメッセージ

変更前のコードをコンパイルしようとすると、以下のようなエラーメッセージが表示される可能性があります:

error CS0123: No overload for 'GetFloat' matches delegate 'System.Func<float>'

または

error CS1501: No overload for method 'GetFloat' takes 1 arguments

これは、GetFloatメソッドが必要とするoutパラメータが欠如しているためです。

変更後のコード

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Audio;

public class BGMSettings : MonoBehaviour
{
    [SerializeField]
    AudioMixer audioMixer;

    [Range(-80f, 0f)]
    public float volume = -20;

    void Update()
    {
        audioMixer.SetFloat("BGMVolume", volume);

        if (audioMixer.GetFloat("BGMVolume", out float currentVolume))
        {
            Debug.Log($"BGMのボリューム: {currentVolume}");
        }
    }
}

各部分の解説

  • ボリュームの設定
   [Range(-80f, 0f)]
   public float volume = -20;
  • [Range(-80f, 0f)]属性を使用することで、インスペクター上でスライダーとして表示され、-80dBから0dBの範囲で値を調整できます。
  • public float volume = -20;は、初期値を-20dBに設定しています。
  • Updateメソッド
   void Update()
   {
       audioMixer.SetFloat("BGMVolume", volume);

       if (audioMixer.GetFloat("BGMVolume", out float currentVolume))
       {
           Debug.Log($"BGMのボリューム: {currentVolume}");
       }
   }
  • Updateメソッドは毎フレーム呼び出されるため、volumeの値が変更された場合に即座にAudioMixerに反映されます。
  • audioMixer.SetFloat("BGMVolume", volume);で、BGMVolumeパラメータに対して現在のvolume値を設定しています。
  • audioMixer.GetFloat("BGMVolume", out float currentVolume)で、現在のボリューム値を取得し、成功した場合にDebug.Logでコンソールに出力しています。これにより、ボリュームの現在の値をデバッグ目的で確認できます。

まとめ

新しいBGMSettingsクラスは、AudioMixerを使用してBGMの音量を管理するために設計されています。volumeパラメータを公開し、インスペクター上で簡単に調整できるようにし、毎フレーム音量を反映させる仕組みになっています。これにより、ゲーム内でのBGM音量の調整が柔軟かつリアルタイムに行えるようになります。

Audio,Unity

Posted by hidepon