ゼニガネブログ

ゲーム開発のための小ネタなど。現在はUnityメインでやってます

【Unity】AudioMixerで遊んでみよう!(3/3)

今回が最終回です。前回の記事はこちら

リバーブがオンの状態でメニューを開いたときに、リバーブがオフになってしまっているという問題を解決していきます。

なぜ発生するのか

スナップショットは対象AudioMixerのエフェクトの状態を保存しています。
今までに作成されたスナップショットは「洞窟」「草原」「メニュー(実は草原用だった)」の3つです。
今回は仕様としてフィールドが2種類しかないので「メニュー(洞窟)」のスナップショットさえ作れば解決できます。
しかしフィールドを増やすたびにそのメニュー用スナップショットが増えていくのはイマイチな感じがするので別のアプローチを試してみます。
※スナップショットを使わずに自力でスクリプト制御するパターンもありますが、今回はスナップショットを使います。

別のアプローチ:AudioMixer自体の親子関係を使う

実はAudioMixerグループだけではなくAudioMixer自体にも親子関係を持たせることが出来ます。
f:id:zenigane138:20180220230151p:plain

これもまた重要なのですが、スナップショットはAudioMixer単位で管理されます。
それを利用して、親のAudioMixerで「通常時」「メニュー」、子のAudioMixerで「草原」「洞窟」と設定していきます。
このケースだと子のフィールドが追加されても、親のメニューには影響がないのでスナップショット数の肥大化が防げます。

ここからはSample01シーンを複製したSample02シーンで作業をしていきます。
ProjectビューでSample01シーンを選択した状態でCtrl+Dを押すと複製されます。
複製時のファイル名は連番が振られるので、Sample02になっていると思いますが、そうでない場合はSample02に変更しておいて下さい。
Sample02シーンを開いておきましょう。

f:id:zenigane138:20180220230217p:plain


次にAudioMixerを作成し、グループ、親子関係の設定を行っていきます。
AudioMixerのファイル名はSample02AMとSample02SEAMとSample02VoiceAMにしましょう。

f:id:zenigane138:20180220230247p:plain

では、ここまでの復習も兼ねて各AudioMixerの作成は各自でやってみましょう。
各エフェクトのパラメータ等はSample01AMと同じです。
スナップショット名はSample02AMはDefaultとMenu、Sample02SEAMはGrasslandとCave、Sample02VoiceAMも同様にGrasslandとCaveで設定しておいて下さい。
各AudioMixerの最終型のスクリーンショットは載せておきます。

Sample02AMのグループ設定です。

f:id:zenigane138:20180220230305p:plain


Sample02SEAMのグループ設定です。

f:id:zenigane138:20180220230323p:plain


Sample02VoiceAMのグループ設定です。

f:id:zenigane138:20180220230335p:plain

ここで重要なのは、SFX ReverbをSample02SEAMとSample02VoiceAM側で設定している所です。
こうすることによってSample02AMのスナップショット(メニュー)とは分離して管理が出来ます。

各AudioMixerが作成できた所で、ここからはAudioMixerの親子関係を設定します。
AudioMixerウィンドウのMixersにある子AudioMixerを親AudioMixerにドラッグ&ドロップします。
そうすると小さいウィンドウが開いて、子のMasterを親のどのグループに出力するかを設定します。

f:id:zenigane138:20180220230359p:plain


Sample02SEAMはSEグループに、Sample02VoiceAMはVoiceグループに設定して下さい。

このように設定されていればOKです。

f:id:zenigane138:20180220230419p:plain


子の横にある(○○ of Sample02AM)が親のどこのグループに出力しているかを示しています。

 

これでAudioMixerの準備が整いました。
次に、Sample02シーンの全てのAudioSourceコンポーネントのOutputに先程作成したAudioMixerたちを設定していきましょう。

ここも特に難しくないので復習も兼ねて各自で設定してみましょう。
SEとVoiceをうっかり親のSample02AMに設定してしまうとリバーブが掛からないので注意して下さい。

 

最後に、スクリプトを実装します。
Sample01とは少しだけ構成が変わっているのでSample01Controllerは使えません。
こちらのSample02Controllerをご使用下さい。

Sample01Controllerゲームオブジェクトは削除して下さい。
かわりにSample02Controllerゲームオブジェクトを生成して先程のスクリプトをAddComponentで追加して下さい。

f:id:zenigane138:20180220230444p:plain

またしても数が多いのですがInspectorでこのように設定して下さい。

f:id:zenigane138:20180220230502p:plain

そしてBattleToggle、FieldToggle、MenuToggleのOnValueChangedにSample02ControllerのChanged◯◯Toggleをそれぞれ設定しましょう。

ついに完成!

これでついに最初の記事の完成形まで持っていけました!

【Unity】AudioMixer使ったサンプル - YouTube


さあ実行してみましょう!!


…環境によってはほとんど違いがわからないかもしれませんが、洞窟フィールドでメニューを開いてもちゃんとリバーブが掛かった状態になっています!

まとめ

全3回とそこそこな長さになってしまいましたが、AudioMixerで遊ぶことが出来ました!

エフェクトはデフォルトで組み込まれているだけでも結構な数があって、今回は極一部しかご紹介する事が出来ませんでした。
何か良いサンプルが思いついたらご紹介出来れば!

スナップショットは結構使い所が難しいのかなと思っています。
うまく設計出来ないとスナップショット数が肥大化して、管理が難しくなる場合があります。
なので難しく使わずに、全音フェード(一番親のMasterのAttenuationだけ弄る)だけスナップショットで管理するのもありだと思います。
たしかUnity公式のVRSamplesプロジェクトがそんな構成だった気がします。

 

個人的にはオーディオミドルウェアなしで作る場合は、スナップショットをしっかり使っていけるような設計にしたいと思います。