【Unity】Audio Mixerの状態を保存して切り替え・ブレンド・遷移できるSnapshot機能

Unity の Audio Mixer で、Audio Mixer の状態を保存して切り替える Snapshot 機能の使い方についてまとめます。

Unity 2020.3.11f1

Snapshot 機能とは?

Audio Mixer では、グループの音量(Attenuation)や各種エフェクトのパラメータなど、現在の設定値を Snapshot として保存できます。
保存した Snapshot はスクリプトによって切り替えたりブレンドしたりできます。

本記事ではこの Snapshot 機能についてまとめます。

Audio Mixer の基礎知識については割愛しますが、以下の記事にまとめていますので必要に応じて参照してください。

light11.hatenadiary.com

Snapshot を作成する

Audio Mixerには、デフォルトでは1つの Snapshot が存在しており、変更したパラメータなどの状態はこれに保存されます。

Snapshot を新しく作るには、 Snapshots の右側の + ボタンを押下します。

Snapshotを作成

作成した Snapshot をクリックするとアクティブな Snapshot が切り替わり、それ以降編集したパラメータはその Snapshot に保存されます。
新しい Snapshot のパラメータを適当に変更してから Snapshot を切り替えると、状態が切り替わることを確認できます。

切り替え

再生時の Snapshot を設定する

前節のように Snapshot は複数作成できるため、ゲームの再生を開始した時にそのうちのどれを使うかを設定する必要があります。
これは Snapshot を右クリックして開いたメニューの Set as start Snapshot から設定できます。

設定

start Snapshot として設定された Snapshot の右側には★が表示されます。

Snapshot を切り替える

Snapshot を切り替えるにはAudioMixerSnapshot.TransitionTo()を使用します。

using UnityEngine;
using UnityEngine.Audio;

public class Example : MonoBehaviour
{
    [SerializeField] private float _transitionTime = 1.0f;
    [SerializeField] private AudioMixerSnapshot _snapshot1;
    [SerializeField] private AudioMixerSnapshot _snapshot2;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
            _snapshot1.TransitionTo(_transitionTime);

        if (Input.GetKeyDown(KeyCode.B))
            _snapshot2.TransitionTo(_transitionTime);
    }
}

なお上記では AudioMixerSnapshotSerializeField で設定していますが、以下の様に AudioMixer から取得することもできます。

AudioMixer mixer;
mixer.FindSnapshot("SnapshotName");

Snapshot をブレンドする

AudioMixer.TransitionToSnapshots を使用すると、指定した Snapshots を指定した重みでブレンドした状態に遷移することができます。
以下は複数の Snapshot を均等な重みでブレンドしている例です。

using UnityEngine;
using UnityEngine.Audio;

public class Example : MonoBehaviour
{
    [SerializeField] private float _transitionTime = 1.0f;
    [SerializeField] private AudioMixerSnapshot[] _snapshots;
    [SerializeField] private AudioMixer _mixer;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            var weights = new float[_snapshots.Length];
            for (var i = 0; i < weights.Length; i++) 
                weights[i] = 1.0f;
            _mixer.TransitionToSnapshots(_snapshots, weights, _transitionTime);
        }
    }
}

遷移時の補間方法を設定する

Snapshot 間を遷移する時には、エフェクトなどの各パラメータはデフォルトでは線形補間されます。
各パラメータの右クリックメニューから、この補間方法を変更することができます。

補間方法の変更

関連

light11.hatenadiary.com

参考

docs.unity3d.com