LoginSignup
7
2

UE5+ミドルウェア「ADX」で、「補完(クッション)フレーズ」を使いシームレスなBGM演出

Last updated at Posted at 2023-12-19

はじめに

ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5とサウンドミドルウェア「ADX for UE」を連携させ、ゲーム中の演出として
BGMの切り替わりにクッションとなるフレーズを演奏することで切れ目のないBGMを演出する」という実装を試してみるものです。

こちらは先日の勉強会「UE Tokyo .dev #2」内のライトニングトークとして紹介したインタラクティブミュージックの実装例「UE5+ミドルウェアでインタラクティブミュージック!」の内容を発展させ、応用してみた実装例です。

当記事ではUE5.2を使用します。基本的にブループリントのみでの実装を想定しています。
ADX for UEはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/

前提

ADX for UEの導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)

ADX for UEの導入で、一歩上のサウンド表現を(実践編)

実装

AtomCraftでサウンドを用意する

まずはサウンドオーサリングツール「AtomCraft」でBGMに使用するサウンドを組み立てます。
今回はサウンド素材として、

  • 「ADX_BGM_A」: 最初の部屋のBGM
  • 「ADX_BGM_AT」: 最初の部屋から移動した際の「補完フレーズ」
  • 「ADX_BGM_B」: 2番目の部屋のBGM
  • 「ADX_BGM_BT」: 2番目の部屋から移動した際の「補完フレーズ」
    の4点を用意しました。

それぞれマテリアルツリーにインポートします。
「マテリアルルートフォルダー」内のサブフォルダに格納することで見やすくなります。
A01.png

「ADX_BGM_A」「ADX_BGM_B」は部屋にいる間ループして再生し続けたいので、インスペクターにて「ループ情報の上書き」を「True」にしてループ再生を有効にします。
A01B.png

マテリアルからキューを作成します。
通常通りにキューを作ってもいいのですが、今回は簡易なキューがそれぞれ欲しいのでマテリアルツリーからマテリアルをドラッグ&ドロップすることで「ポリフォニック」タイプのキューを作ります。
A02.png

4つのキューが作成されました。
A03.png

キューのトラックリストで右クリックし、「新規オブジェクト」→「ビート同期トラックの作成」を選択します。
A06.png

ビート同期トラックを選択し、インスペクターにてBPMを正しく設定します。
A07.png
ビート同期ラベルを作成しておきます。
A08.png

ここまでできたらキューシートをビルドします。
A04.png
A05.png

UE5にサウンドを組み込む

UE5でビルドしたキューシートをインポートします。
B01.png
acfファイルインポート時のダイアログでは両方とも「Yes」を選択します。
これにより、自動的にacfファイルがプロジェクトに設定されます。
B02.png
B03.png
acbファイル(キューシート)を開き、キューが正常に再生されることを確認します。
B04.png

レベルブループリントからBGMを再生する

今回はふたつの部屋を作り、左の部屋と右の部屋でBGMが切り替わるようにします。
C01.png

「Open Level Blueprint」からレベルブループリントを開きます。
C02.png

ゲーム開始時のイベントでSpawn Sound 2Dノードを使い、BGMを再生します。
(画像内のSet View Target with Blendノードはカメラ用の処理なので、今回は必須ではありません)
C03.png

Spawn Sound 2Dノードのインプットピンを右クリックし、「Promote to Variable」から変数を作成します。
C04.png

「BGM」と名前をつけました。
C05.png

グラフをコンパイルし、Detailsパネルで変数に既定のキューを設定します。
C06.png

Spawn Sound 2Dノードを展開します。
C07.png

「Auto Destroy」のチェックを外します。
通常Spawn Sound 2Dで再生したAtomコンポーネントは再生終了時に破棄されますが、今回は後で異なるキューを再生するために使いまわしたいので、自動的に破棄されないようにします。
C08.png
ゲームを再生し、BGMが流れることを確認します。
C09.png

テンポを監視し、イベントを発火する

新規に変数を追加します。プレイヤーが現在いる部屋を記録しておく、Int型の「CurrentRoom」です。
D01.png

レベルにふたつのBox Triggerボリュームを追加します。
それぞれが部屋を覆うようにサイズを調整しました。
D02.png

ボリュームを選択した状態でレベルブループリントに戻り、On Actor Begin Overlapイベントを配置します。
D03.png

このイベントの後にBranchノードでGet Player Characterとの同一性を確認しておけば、プレイヤーが部屋を移動したかが判定できます。
この処理をふたつのボリュームについて作っておきます。
D04.png

プレイヤーが部屋を移動したら、変数「CurrentRoom」を変更します。
D04B.png

Event BeginPlayからの処理に戻り、Spawn Sound 2Dの青いアウトプットピンを右クリックして「Promote to Variable」で変数化します。
D05.png

変数に「Atom BGM」と名前をつけ、さらにそのアウトプットピンから線を伸ばし「Assign On Atom Sound Cue Beat Sync」を選択します。
D06.png
Bind Event to On Atom Sound Cue Beat Syncノードと、イベントノードが配置されます(「OnBeat」と名前をつけました)。
これはBGMのビートに合わせて発火するイベントです。
D07.png
OnBeatイベントからPrint Stringノードを置き、テストとしてビートごとに文字を表示してみます。
D08.png

ゲームを再生すると、画面左上に小節内のビート数が表示されます。
D09.png

補完フレーズを再生し、BGMを切り替える

Int型の変数を追加します。現在再生中のBGMインデックスを記録するもので、名前を「CurrentBGM」とします。
E01.png
「補完フレーズ」はBGMの小節の始めの「ちょうどいいところ」で再生を開始したいので、「Beat Count」を監視し「0」の場合にBGMの切り替わり判定を開始します。
現在のBGMとプレイヤーが現在いる部屋が一致しているかをBranchで分岐させます。
E02.png

BGMのキューを一括で記憶しておくため、新しく変数を作ります。型は「Atom Sound Cue」で、「Variable Type」の横のマークを選択し配列(array)化します。
E03.png
コンパイルし、「Default Value」にキューを格納していきます。
E04.png

現在のBGMとプレイヤーが現在いる部屋が一致していない場合、BGMのキューを変更します。
ここで指定するのは補完フレーズとなる「ADX_BGM_AT」か「ADX_BGM_BT」です。
Selectノードを使い、「CurrentBGM」変数の値によって「BGMList」のインデックスを指定します。
(画像を見てもノードのはたらきが分かりにくい場合でも、ひとまず同じように組んでみるとイメージできるかもしれません)
また、その後で「CurrentBGM」に「CurrentRoom」の値を代入して一致させます。
E05.png

補完フレーズの再生が停止するのを待って次の部屋のBGMを再生開始したいので、Bind Event to On Atom Sound Play State Changedを配置し、再生状態の変化をイベントに通知します。
E06.png

Bind Event to On Atom Sound Play State Changedが発火させるイベントでは再生状態が取得できます。
これはイベントノードのアウトプットピンからSwitchノードを引き出すと状態別に処理を分岐させられます。
E07.png
「Stopped」(再生停止時)のみ次の部屋のBGMを再生する処理を続けます。
E08.png

そのままでは再生状態が切り替わるたびにイベントが走ってしまうので、処理が完了したら一旦イベントの発火を停止させます。
E09.png

完成!

これで部屋を移動した際に補完フレーズを挟んだ上で、次の部屋(マップ)のBGMを再生することで繋がっていくBGMを作ることができました。

遷移先のBGMがある程度特定できる場合は「ブロック再生」や「REACT」機能を使うという方法もあります。
参考となる記事がありますので、必要に応じて参照してみてください。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2