はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5とサウンドミドルウェア「ADX for UE」を連携させ、
ゲーム中の展開に応じてBGMがシームレスに変化していく「インタラクティブミュージック」を実装します。
以前執筆した記事でもインタラクティブミュージックを扱っていますが、
ADX + UE5でインタラクティブミュージック(AtomCraft編/新バージョン対応)
ADX + UE5でインタラクティブミュージック(ブループリント編)
これらがトラックのパラメータを調整してBGMを遷移させているのに対し、今回はADXの「ブロック再生」機能により、曲の再生位置をダイナミックに変化させ、BGMの展開を変化させる方法を取ります。
普通にBGMを再生するとAメロ→Bメロ→サビといった通常の進行をしますが、Aメロ→サビ(何度かループ)→Aメロ→Bメロといったように変則的な進行が可能になります。
当記事ではUE5.2を使用します。基本的にブループリントのみでの実装を想定しています。
ADX for UEはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/
前提
ADX for UEの導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)
ADX for UEの導入で、一歩上のサウンド表現を(実践編)
この記事での実装目標
- 曲のイントロが終わるとゲームを監視し、BGMを変化させる処理に入る
- キャラクターが一定のエリアに入るとBメロやサビに遷移する
- ゴールまで辿り着くとアウトロを一度だけ流し、再生を終了する
実装
AtomCraftでBGMを構成する
素材の用意
まずはAtomCraftでBGMを構成し、UE5で変化させるための準備をします。
今回はBGM素材を用意しましたので、もしすぐに試せる音源がない場合使ってみてください。
https://drive.google.com/file/d/12FlChB751am1Gp-KwbU9Q-Jq6_MH3N--/view?usp=sharing
素材のインポート
上記の素材では曲の展開ごとにファイルがばらばらになっていますが、後述する「ブロック再生」機能の設定をすれば、ひとつに繋がったBGMファイルでも問題ありません。
キューの作成
新規にキューを作成します。今回は「ポリフォニック」タイプにします。

トラック、ブロックの設定
タイムラインにマテリアルをドラッグアンドドロップし、トラックを作成します。

そのままトラックリストの空欄で右クリックし、「新規オブジェクト」→「ブロックの作成」を選びます。

「ブロック」が生成されたので、選択してインスペクターで名前を分かりやすいものに設定しておきます。

「ブロック」は、「Aメロ」「Bメロ」「サビ」のように楽曲の区切りとして使用できるものです。
ブロックごとに遷移先を動的に指定したり、何度ループしてから次のブロックに移るかなどを設定することができます。
インスペクターで「ブロックループ回数」に「1」と入力して再生(F5)すると、一度だけブロックが繰り返されてから停止します(テスト再生はF6キーで停止できます)。

2番目の楽曲ファイルをタイムラインに追加すると、新しくブロックが生成されます。
こちらも分かりやすい名前にしておきます。

また、ブロックの始端、終端をフレーズと同じ長さになるよう調整します。

同様にすべての楽曲ごとにトラック、ブロックを作成します。
今回はブロックを「イントロ」「Aメロ」「Bメロ」「サビA」「サビB」「アウトロ」と分けました。

最初のブロックで試しに設定したループ回数は0に戻しておきます。

ブロックの遷移先指定
ブロックが適切にループと遷移ができるよう設定していきます。
「ブロックループ回数」を「-1」にすると、プログラム側で遷移先を設定しない限り無限にループ再生されます。
ゲームにおいては、状況が変わらない限り同じ箇所を再生し続けてほしい場合などに便利です。

Block_Intro(イントロ)
ブロック遷移先: 次のブロック
ブロックループ回数: 0
イントロは一度再生すると、Aメロに遷移します。
Block_A(Aメロ)
ブロック遷移先: なし
ブロックループ回数: -1
Block_B(Bメロ)
ブロック遷移先: なし
ブロックループ回数: -1
Block_C(サビ前半)
ブロック遷移先: 次のブロック
ブロックループ回数: 1
Block_D(サビ後半)
ブロック遷移先: ブロック遷移先指定(後述)
ブロックループ回数: 1
Block_Outro(アウトロ)
ブロック遷移先: なし
ブロックループ回数: 0
サビでは前半、後半をそれぞれ2回繰り返し演奏した後、サビの最初にループさせます。
Block_C(サビ前半)からはBlock_D(サビ後半)に遷移し、
Block_DからはBlock_Cに遷移します。
Block_DからBlock_Cに戻るには、「ブロック遷移先指定」を使用します。
まずはインスペクターで「ブロック遷移先」を「ブロック遷移先指定」に設定し、

「ブロック」の項目で遷移先のブロック名に「Block_C」を指定します。

これでサビのループが完成します。
ブロックの分割
ゲームの展開が速い場合、状況の変化に対してブロック遷移が遅すぎるためにBGMがついてこれない場合があります。
「ブロック分割数」を多めに設定し、「ブロック遷移タイミング」を「指定分割で」に設定することで、BGMのテンポに合わせて遷移するというルールは守りつつ、遷移タイミングを増やすことができます。

「ブロック遷移タイミング」を「即時」にすると、遷移が即座に行われますがテンポに違和感が生じることがあります。
キューシートのビルド
UE5でインタラクティブミュージックを実装する
キューシートのインポート
ビルドしたキューシート(acf,acbファイル)をコンテンツブラウザ(コンテンツドロワ)にドラッグアンドドロップし、インポートします。
その際に表示されるダイアログでは、どちらも「Yes」を選択します。これにより、プロジェクト設定が自動的に設定されます。


AtomConfigとキューシートがアセットとしてインポートされたことを確認します。

キューシートを開き、正常に再生されることを確認しておきましょう。

レベルを作成する
今回、デフォルトのアセットを使用してこんな感じのレベルを作りました。

レベルができたらコンテンツブラウザからキューをドラッグアンドドロップして配置します。ひとまずこれで再生はされるはずです。
各エリアに進入したことを感知するため、部屋をカバーできるように「Trigger Volume」を置きます。


キューを再生し、変数として登録します。
キューを選択した状態でレベルブループリントを開きます。

イベントグラフで右クリックし、「Create a Reference to (アクター名)」を選択してリファレンスノードを作ります。

リファレンスノードのアウトプットピンを右クリックして「Promote to Variable」を選択して、変数を作ります。
変数化することで、ブループリントから容易にアクセスすることが可能になります。

Event Begin Playと線をつなげ、レベル開始時にこの処理が走るようにします。

ブロックを遷移させる
実際にブループリント側からブロックを遷移させていきます。
レベル上のトリガーボリュームを選択した状態でレベルブループリントを開きます。

イベントグラフで右クリックし、「Add On Actor Begin Overlap」を選択します。

アクターがこのボリュームに進入した際のイベントができました。

Branchノードを使い、プレイヤーキャラが進入したときのみ処理を継続します。

ブロックの遷移先はSet Cue Next Block Indexノードで指定します。
ここではBメロに移行してほしいので、「Block Index」は「2」です。

すべてのトリガーボリュームに対し、同じように処理を書いていきます。

これで完成です!
ゲームを再生し、動作を確認してみましょう。
イントロからAメロへの移行、各エリアでのブロックの遷移、サビの特殊なループなどが体験できるでしょうか?

ADX for UEの新バージョンにおいて機能が増え、ブループリントでの処理を最小限に抑えて多彩な演出が可能になりました。
ぜひゲームの重要な場面においてブロック遷移を活用し、シーンとシンクロした演出をしてみてください。






