2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ADX2 for UE4でインタラクティブミュージック(ブロック再生編)

Last updated at Posted at 2020-06-30

はじめに

UE4.23+「ADX2 LE v2.10.05」を使用します。
アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を連携させ、
ゲーム中の展開に応じてBGMがシームレスに変化していく「インタラクティブミュージック」を実装します。
以前インタラクティブミュージックの実装について記事を書きましたが、

ADX2 for UE4でインタラクティブミュージック(AtomCraft編)
https://qiita.com/SigRem/items/8af9b7d8445477906741
ADX2 for UE4でインタラクティブミュージック(ブループリント編)
https://qiita.com/SigRem/items/b53dc03d01c5f8fe1465

これらがトラックのパラメータを調整してBGMを遷移させているのに対し、今回はADX2の「ブロック再生」機能により、**「曲の再生位置をダイナミックに変化させ、BGMの展開を変えてしまう」**方法を取ります。

C01.png

普通にBGMを再生するとAメロ→Bメロ→サビといった通常の進行をしますが、Aメロ→サビ(何度かループ)→Aメロ→Bメロといったように変則的な進行が可能になります。

前提

「ADX2 for UE4 LE」を使用します。導入や簡単な使い方は以下の記事にあります。
ADX2 for UE4の導入で、一歩上のサウンド表現を(導入編)
https://qiita.com/SigRem/items/4250925f6d66a4fd287a
ADX2 for UE4の導入で、一歩上のサウンド表現を(実践編)
https://qiita.com/SigRem/items/c089b71c42e898980a46

#やること

  • 曲のイントロが終わるとゲームを監視し、BGMを変化させる処理に入る
  • キャラクターが一定のエリアに入るとサビに遷移する
  • エリアにいる間はサビを再生し続け、退出するとAメロに戻ってクールダウンする
  • ゴールまで辿り着くとアウトロを一度だけ流し、再生を終了する

実装

AtomCraftでBGMを構成する

素材の用意

まずはAtomCraftでBGMを構成し、UE4で変化させるための準備をします。
今回はBGM素材を用意しましたので、もしすぐに試せる音源がない場合使ってみてください。
https://drive.google.com/file/d/12FlChB751am1Gp-KwbU9Q-Jq6_MH3N--/view?usp=sharing

素材のインポート

音源をマテリアルツリーにインポートします。
A01.png
上記の素材では曲の展開ごとにファイルがばらばらになっていますが、後述する「ブロック再生」機能の設定をすれば、ひとつに繋がったBGMファイルでも問題ありません。

キューの作成

新規にキューを作成します。今回は「ポリフォニック」タイプにします。
A02.png

トラック、ブロックの設定

タイムラインにマテリアルをドラッグアンドドロップし、トラックを作成します。
A03.png
そのままトラックリストの空欄で右クリックし、「新規オブジェクト」→「ブロックの作成」を選びます。
A04.png
「ブロック」が生成されたので、選択してインスペクターで名前を分かりやすいものに設定しておきます。
A05.png

**「ブロック」**は、「Aメロ」「Bメロ」「サビ」のように楽曲の区切りとして使用できるものです。
ブロックごとに遷移先を動的に指定したり、何度ループしてから次のブロックに移るかなどを設定することができます。
インスペクターで「ブロックループ回数」に「1」と入力して再生(F5)すると、一度だけブロックが繰り返されてから停止します(テスト再生はF6キーで停止できます)。
A06.png
2番目の楽曲ファイルをタイムラインに追加し、ブロックを追加します。
A07.png
こちらも分かりやすい名前にしておきます。
A08.png
同様にすべての楽曲ごとにトラック、ブロックを作成します。
今回はブロックを「イントロ」「Aメロ」「Bメロ」「サビA」「サビB」「アウトロ」と分けました。
A09.png
最初のブロックに試しに設定したループ回数は0に戻しておきます。
A10.png

キューシートのビルド

ひとまず、ここまででキューシートをビルドしておきます。
A11.png
A12.png

##UE4でインタラクティブミュージックを実装する

###キューシートのインポート
ビルドしたキューシート(acf,acbファイル)をコンテンツブラウザにドラッグアンドドロップし、インポートします。
B01.png
ツールバーの「Edit」→「Project Settings」を開き、「CriWare」のタブから「Atom Config」をインポートしたacfファイルにします。
B02.png
必要に応じてエディタを再起動します。

レベルを作成する

B03.png
新規にレベルを作成し、コンテンツブラウザからキューをドラッグアンドドロップして配置しました。ひとまずこれで再生はされるはずです。

今回、デフォルトのアセットを使用してこんな感じのレベルを作りました。
B04.png
楽曲と連動する要素として、以下のように想定します。
C02.png

各エリアに進入したことを感知するため、部屋の入り口にトリガーを置きます。
B05.png
B06.png
「Trigger_RoomA」を置いたのは、サビ再生エリアから戻ってきた際に曲の進行をAメロに戻すためです。

キューの再生位置を取得する

最初の部屋ではイントロ→Aメロ→Bメロ→再びAメロという流れにしたいので、再生位置に応じて遷移先のキューを指定してあげる必要があります。
レベルブループリントを開き、以下のようなブループリントを組むことで画面上に再生位置が出力されます。
Get Sequence Positionが再生位置の取得をするノードです。
B07.png
B08.png
サンプル音源の場合、Aメロ→Bメロのループの場合は20秒付近で、サビA→サビBのループは35秒付近でループ命令を渡してあげれば大丈夫そうです。

現在のエリアを取得し、変数に代入する

プレイヤーがいるエリアを記憶しておくための変数を作成します。
B09.png
Int型で、値はエリアAでは「0」、エリアBでは「1」、ゴール地点では「2」とします。

トリガーを選択し、OnActorBeginOverlapイベントを作成します。
B10.png
すべてのトリガーに対して同様にイベントを追加します。
B11.png

それぞれがプレイヤーキャラクターを感知した際、エリアの値を「CurrentArea」変数に代入します。
B12.png

エリアに対応したブロックに遷移させる

遷移先のブロックを指定するには、Set Next Block Indexノードを使用します。今回の処理の肝です。
これにより指定されたインデックス番号のブロックが、現在のブロックの再生を完了した後に再生されます。
B13.png

異なるブロックをループさせる

仕上げに、「Aメロ→Bメロ→Aメロ」といったように異なるブロックをループさせる処理です。
Tickイベントで再生位置を取得した後、Switch on Intで変数「Current Area」の値ごとに処理を分岐させます。
B14.png
エリアAでは再生位置が20秒を越えたあたりで遷移先ブロックをAメロである「1」に、エリアBでは35秒を越えたあたりで遷移先ブロックをサビAのブロックである「3」に指定します。
B15.png

ここまででとりあえず処理は完成です!ループ処理は雑にTickイベントで処理してしまいましたが、他に適切なタイミングがある場合、処理速度の問題が気になる場合は明確なトリガーを作ったほうがベターです。
テストプレイしてみると、設計した通りにエリアに応じたBGMがループするはずです。
B16.png

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?