BGMのクロスフェードを実装しようとして、そういえばAudioMixerを使ったことがあったなーと思ったが、
いざ触ってみると意外とハマるので、メモ。
自分用のメモの為、読んで使えるようにはならない記事。
○仕組み
AudioMixerを構成する要素として
・Mixer(正式名称不明)
・SnapShot
がある。
Mixerは、AudioSourceとひも付き、そのAudioSourceの音を調整する補助マシンのような物だ。
AudioSourceのOutputという項目に設定ができる。
例えば、AudioSourceは単体で勝手に音もなるし、ボリュームも設定できるが、
Mixerを設定すれば、そのMixerを設定している全てのAudioSourceに、そのMixerの設定を一括設定できる。
SnapShotは、各Mixerのサウンド状態を保存しておき、その状態を復元するための設定だ。
例えば、BGMを再生するMixerを2つ用意しておき、
- Snapshot1:Mixer1=Vol80、Mixer2=Vol0
- Snapshot1:Mixer1=Vol0、Mixer2=Vol80
として、SnapShotを切り替えれば、Bgmのクロスフェードが簡単に実装できる。
public class SoundManager : BestPracticeSingleton<SoundManager> { [SerializeField] private AudioSource[] BgmAudioSource = null; [SerializeField] private AudioClip[] BgmAudioClipList = null; // ここの設定が、MixerのAとBの音量が異なる設定がされている [SerializeField] private AudioMixerSnapshot[] AudioMixerSnapshot_BgmCrossFade = null; // とりあえず、一個しか使わないのであれば、これ使っておけば良いと思われ [SerializeField] private AudioMixer SoundAudioMixer = null; public void PlayBgm(Enum.Bgm bgm, float fadeTime = 0f) { AudioSource source = AnyAudioSource; source.clip = AnyAudioClip; source.Play(); source.loop = true; if (BgmAudioUseIndex == 0) { weights = new float[2] { 1.0f, 0.0f }; } else { weights = new float[2] { 0.0f, 1.0f }; } SoundAudioMixer.TransitionToSnapshots(AudioMixerSnapshot_BgmCrossFade, weights, fadeTime); } }