(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


Audio Mixerの設定をポーズ中や水中などに応じて一括で変えられるSnapshot【Unity】【Audio Mixer】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 6000.4.5f1


はじめに

以前、Audio SourceをBGMやSEなどのグループごとに管理するAudio Mixerを紹介しました。



今回はそのAudio Mixerの設定をまとめて保存し、一括で変えられるSnapshotの紹介です!

これを使えば、ポーズ中に音を抑える、水中でこもった音にする、みたいな事が簡単に行えます。


Snapshot

SnapshotはAudio Mixerウィンドウの+ボタンから作成できます。

(今回は通常時用のNormalと、ポーズ中用のPauseを作成)


作成したSnapshotを選択した状態で各設定を変更すると、そのSnapshotの設定として保存されます。


ただし、エフェクトの追加と削除は全てのSnapshotで共通になるため、

無効にしたい場合は削除ではなく設定値を変える感じになります。


また、ゲーム開始時に設定されているSnapshotは星マークが付いてるもので、

右クリックのStart Snapshotから設定します。


そしてSnapshotを切り替える場合は、AudioMixerSnapshotのTransitionToを使います。

//_pauseSnapshotはAudioMixerSnapshot
//_pauseSnapshotの状態へ0.5秒かけて切り替える
_pauseSnapshot.TransitionTo(0.5f);


さらに、複数のSnapshotを混ぜたい場合はTransitionToSnapshotsを使います。

//混ぜたいSnapshotを配列でまとめる
AudioMixerSnapshot[] snapshots = {
  _normalSnapshot,
  _pauseSnapshot,
};

//それぞれのSnapshotをどれだけ混ぜるか
float[] weights = {
  0.2f,//Normalを20%
  0.8f,//Pauseを80%
};

//指定した混ぜ方に0.2秒で切り替える
_audioMixer.TransitionToSnapshots(snapshots, weights, 0.2f);


ちなみにFindSnapshotを使う事で、名前からAudioMixerSnapshotを検索する事も可能です。

//Pauseという名前のAudioMixerSnapshotを取得、なければnull
AudioMixerSnapshot snapshot = _audioMixer.FindSnapshot("Pause");
if (snapshot == null) {
  Debug.LogWarning($"PauseというSnapshotが見つかりません。");
}


なお、Time.timeScaleが0の場合はデフォルトの設定ではSnapshotの切り替えが進まないため、

「timeScaleを0にしてポーズする、その時にSnapshotで設定を切り替える」みたいな場合は、

AudioMixerのupdateModeをUnscaledTimeにしておくといいかと思います。

//コードで変えたい場合
_audioMixer.updateMode = AudioMixerUpdateMode.UnscaledTime;


前回紹介したSetFloatとSnapshotを組み合わせる場合も注意が必要で、

SetFloatを使うと、その値はSnapshotでは制御されなくなってしまいます。



なので、Snapshotで切り替えたい値は、基本的にはSetFloatで直接変更しない方が無難です。

(もしくはSetFloat操作用とSnapshot操作用のグループを分ける等)