【Unity】オーディオミキサーのパラメータをスクリプトで変える

投稿者: | 2021-04-19

オーディオミキサーのパラメータをスクリプトで変えてみました。

パラメータをスクリプトで見れるようにするには、まず変更したいパラメータをインスペクタに表示します。

例えば、グループ1を選択します。

このグループのボリュームを変えたいときは、Attenuationを右クリックして、「Expose “Volume…」を選択します。

すると、オーディオミキサーの右上の「Exposed Parameters」をクリックした時にこれが表示されます。

パラメーターの名前は、ダブルクリックして変更できます。この名前をスクリプトで使います。

パラメータにFloat型の値を入れるには、AudioMixer.SetFloatメソッドを使います。

using System.Collections;
using UnityEngine;
using UnityEngine.Audio;

public class Player7 : MonoBehaviour
{
    [SerializeField] AudioMixerSnapshot[] snapshots;
    [SerializeField] AudioMixer mixer;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    void Update()
    {
        // キー入力でフェードアウト
        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            StopAllCoroutines();
            StartCoroutine("FadeOut");
        }
        // キー入力でフェードイン
        else if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            StopAllCoroutines();
            StartCoroutine("FadeIn");
        }
    }

    // Group1の音量を下げる
    IEnumerator FadeOut()
    {
        mixer.GetFloat("Group1Volume", out float vol);

        while (true)
        {
            yield return null;

            vol -= 1f;

            if (vol <= -80f)
            {
                vol = -80f;
                mixer.SetFloat("Group1Volume", vol);
                yield break;
            }

            mixer.SetFloat("Group1Volume", vol);

        }
    }

    // Group1の音量を上げる
    IEnumerator FadeIn()
    {
        mixer.GetFloat("Group1Volume", out float vol);

        while(true)
        {
            yield return null;

            vol += 1f;

            if(vol >= 0f)
            {
                vol = 0f;
                mixer.SetFloat("Group1Volume", vol);
                yield break;
            }

            mixer.SetFloat("Group1Volume", vol);

        }
    }


    // トリガーを出たら、1つ目のスナップショットに切り替える
    private void OnTriggerExit(Collider other)
    {
        if (other.tag == "Cube")
        {
            mixer.TransitionToSnapshots(snapshots, new float[] { 1f, 0f }, 1f);
        }

    }

    // トリガーに入ったら、2つ目のスナップショットに切り替える
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Cube")
        {
            mixer.TransitionToSnapshots(snapshots, new float[] { 0f, 1f }, 1f);

        }
    }
}

コルーチンの中で値を入れ続けることで、徐々にボリュームを変えています。

値を取得したいときは、AudioMixer.GetFloatメソッドを使います。アニメーターのGetFloatメソッドとは違い、第2引数にoutキーワードを前置きします。

mixer.GetFloat("Group1Volume", out float vol);

パラメータの変更の他に、トリガーの出入りによって、スナップショットを遷移させています。パラメータをスクリプトで変更できるようにすると、スナップショットをバイパスすることを確認するためです。

赤いトリガーに入ると、スナップショットが遷移してリバーブの値が変わっています。その間、スナップショットの遷移とは無関係に、ボリュームの値が変化しているのがわかります。

スナップショットを遷移させる

スナップショットは+ボタンから新規作成できます。

ダブルクリックで名前を変更できます。

グループにエフェクトを追加するには、「Add…」からエフェクトを選択します。

Group1を選択するとインスペクタでエフェクトの値を変更できます。その時に選択されているスナップショットにその状態が保存されます。

スクリプトでスナップショットを遷移させるには、AudioMixer.TransitionToSnapshotsメソッドを使います。

// トリガーを出たら、1つ目のスナップショットに切り替える
private void OnTriggerExit(Collider other)
{
    if (other.tag == "Cube")
    {
        mixer.TransitionToSnapshots(snapshots, new float[] { 1f, 0f }, 1f);
    }

}

// トリガーに入ったら、2つ目のスナップショットに切り替える
private void OnTriggerEnter(Collider other)
{
    if (other.tag == "Cube")
    {
        mixer.TransitionToSnapshots(snapshots, new float[] { 0f, 1f }, 1f);

    }
}

第一引数にはスナップショットの配列、第二引数にはそれぞれのスナップショットのウェイトの配列を渡します。中間の値にして、アニメーションのようにブレンドすることもできます。

第三引数には遷移にかかる時間を渡します。

Cubeにはタグとコライダーが付いていて、コライダーのIs Triggerのチェックが入っています。

これで、トリガーに出入りすると、スナップショットが遷移して、リバーブの値が徐々に変わります。

コメントを残す

メールアドレスが公開されることはありません。