
マイケル
みなさんこんにちは!
マイケルです!

エレキベア
こんにちクマ〜〜〜

マイケル
前回の記事に引き続き、Wwiseを使用したサウンド制御について触れていきます!
今回はサウンドミドルウェアの醍醐味である「インタラクティブミュージック」の実装例について紹介します!
具体的には下記のようなサンプルになります。

【Unity】第一回 Wwiseを使用したサウンド制御 〜基本動作編〜
2024-03-30
▲前回の記事

▲実装したインタラクティブミュージックのサンプル

エレキベア
おお〜〜〜
サウンドに合わせてオブジェクトが反応するのは見ていて楽しいクマね

マイケル
サンプルプロジェクトのリポジトリと、CRI関連処理については下記になります!
こちらも合わせてご参照ください!
GitHub - unity-multi-audio
▲サンプルプロジェクト
フォルダ | 内容 |
---|---|
Wwiseプロジェクト | |
APIを実行する処理 | |
サンプルゲーム固有のオーディオ関連処理 | |
サンプルゲームに関する処理 | |
Wwiseプロジェクトから出力したサウンドデータ |

エレキベア
中々ボリュームのあるサンプルクマ
参考書籍

マイケル
今回実装するにあたり、下記書籍を参考にさせていただきました!


マイケル
Wwiseには触れていませんが、UnityAudioとCRIADXを使用した実装について紹介されているためサウンドミドルウェアを使用するイメージが掴めると思います!

エレキベア
Unityでのサウンド実装について幅広く知れる一冊クマね
インタラクティブミュージックの実装

マイケル
それでは早速実装内容について見ていきます!
インタラクティブミュージックの実装について、今回は下記について盛り込んでみました!
- イントロループからのブロック遷移
- オーディオ側からのイベント発行
- ビート同期によるオブジェクト伸縮
- AISAC値によるサウンド変化

エレキベア
いろいろ盛り込んでるクマね・・・

マイケル
今回のために、サンプル実装がしやすい曲も作りました・・・
それぞれ見ていきましょう!
イントロループからのブロック遷移

マイケル
最初に行ったのが「イントロループからのブロック遷移」処理です。
具体的にどういうことかというと、はじめはイントロをループしておき、プレイヤーが動き始めたらメインとなるブロックに遷移させるといった内容です!

▲プレイヤーが動き始めるまでイントロをループさせる

エレキベア
なんかペルソナのダンジョン出発前とかで見たことがある気がするクマ

マイケル
これを行うには、事前に曲を分割しておく必要があります。
今回は
・イントロ
・イントロループ
・メイン
・メインループ
の4つのブロックに分けて定義しました。

マイケル
これをWwiseで実現するために、MusicSwitchContainer等の仕組みを使用しました。
InteractiveMusicHIerarchyに、
Music Switch Container
- Music Playlist Container
- Music Segment
といった構造で定義します。
Wwiseヘルプ - Music Switch Containerの中身と、再生方法の設定

▲MusicSwitchContainerの定義

▲Music Segment内ではループ等の再生方法を設定する

エレキベア
大きくイントロ、メインに分けて、その中で開始部分とループ部分を定義しているクマね

マイケル
あとはMusicPlaylistContainer内でStateによってイントロとメインを切り替えれるように設定すれば準備は完了です。

▲StateでMusic Playlist Containerを切り替えれるようにする

▲Stateの定義

マイケル
スクリプト側で任意のタイミングでStateを切り替える処理を実行すれば、曲が違和感なく遷移することが確認できるはずです。
▲Stateの設定
▲遷移するブロックのStateを設定する

エレキベア
Wwiseでほぼ設定したからスクリプト側はシンプルクマね
オーディオ側からのイベント発行

マイケル
次は曲がメインの部分に入ったらオブジェクトを表示&背景色を変更するという処理になります。

▲メインの小節に入ったらオブジェクトと背景を表示する

マイケル
これにはEventの中にコールバックを設定することで検知できるようにしました。
あとは設定したタグ名をスクリプト側で受け取ってコールバック登録すれば実装は完了です。
参考:WwiseSDK - 既存のMusic Segmentに、Custom Cueを追加する

▲CustomCueの設定
▲コールバックオプションの定義
▲シーケンスコールバックの登録

エレキベア
Wwiseでは再生時にコールバックを紐づけるクマね
ビート同期によるオブジェクト伸縮

マイケル
次はBGMのリズムに合わせてオブジェクトを伸縮させる処理についてです。
こちらはHi-Fi Rush等でよく見られるような挙動ですね

▲今回はSphereとBoxを対象とした

マイケル
これを行うには、予めオーディオにBGMや小節等のビート同期情報を設定しておく必要があります。
あとはCustomEventと同様、再生時にコールバックを登録すれば実装は完了です。

▲BPM、小節等の設定
▲コールバックの登録

マイケル
なお、SphereやBoxといった伸縮させるオブジェクトには、下記のようなインターフェイスを実装してビート数を受け取るよう実装しています。
こちらも気になる方はリポジトリの実装を参照してみてください!
▲ビート同期オブジェクトのインターフェイス

エレキベア
CustomEventの実装とほぼ同じだったクマね
GameParameterによるサウンド変化

マイケル
最後に味付けにはなりますが、ボスに近づくほどに別のギターパートの音量を上げるよう変化させてみました。
こちらはRTPCという機能を使用して、ゲームから設定したパラメータに応じてサウンド側のパラメータも編集させることで実現しています。

▲ボスに近づくほどにギターパートの音量を上げるように変化させる

▲変化させるパートのRTPC処理を調整
▲GameParameterの設定

エレキベア
DSPエフェクトの実装時にも使用していたクマね
幅広く使えて便利クマ〜〜〜
おわりに

マイケル
というわけで今回はWwiseによるインタラクティブミュージックの実装でした!
どうだったかな?

エレキベア
CRIとはまた設定方法が違って面白かったクマ〜〜〜
どちらも機能は一通り用意されていて活用できそうクマね

マイケル
長かったですが、これにてサウンドミドルウェアの学習は一通り終了です!
今後のゲーム開発で活用していく予定なので、また知見があれば記事にしようかと思います!

マイケル
それでは今日はこの辺で!
アデューーー!!

エレキベア
クマ〜〜〜〜
【Unity】第二回 Wwiseを使用したサウンド制御 〜インタラクティブミュージック編〜 〜完〜

【Unity】第一回 UnityAudioを使いこなす 〜サウンド再生処理編〜
2024-01-22

【Unity】第二回 UnityAudioを使いこなす 〜AudioMixer活用編〜
2024-01-22

【Unity】第一回 CRI ADXを使用したサウンド制御 〜基本動作、周波数解析編〜
2024-03-28

【Unity】第二回 CRI ADXを使用したサウンド制御 〜インタラクティブミュージック編〜
2024-03-28

【Unity】サウンドミドルウェアに依存しない設計を考える【CRI ADX・Wwise】
2024-03-27