ADX2+UE4でゲーム中のヒットサウンドを多機能に実装する


はじめに

アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を使って、ゲーム中の攻撃などのヒットサウンドを多機能に実装してみます。

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

記事執筆時点のADX2 for UE4のSDKバージョンはv1_29です。

前提

ADX2 for UE4の導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
ADX2 for UE4の導入で、一歩上のサウンド表現を(導入編)
https://qiita.com/SigRem/items/4250925f6d66a4fd287a
ADX2 for UE4の導入で、一歩上のサウンド表現を(実践編)
https://qiita.com/SigRem/items/c089b71c42e898980a46

実装

AtomCraftで効果音を構成する

マテリアルの用意

今回は3連の打撃を1コンボとし、それぞれの打撃に弱・中・強の3段階の音を用意しました。
合計9つのマテリアルになります。

キューの作成

キューシートで右クリックし、「新規オブジェクト」→「キュー『スイッチ』の作成」を選択します。

これがコンボ1段目のキューとなるので、トラックを分けて1段目の「弱・中・強」のマテリアルをそれぞれドラッグアンドドロップして配置します。

ゲーム変数の設定

3つのトラックからひとつをゲーム中選択して再生するには、ADX2の「ゲーム変数」機能を使います。
プロジェクトツリーの「ゲーム変数」で右クリックし、「新規オブジェクト」→「ゲーム変数の作成」を選びます。

新しくゲーム変数が作られるので、適当に名前をつけます。画像では「HitStrength」としました。

キューを選択し、インスペクター中段にて「スイッチ」のボタンを押し、スイッチ変数を先ほど作成したものにします。


「等分化」ボタンを押し、各トラックに振り分けられるゲーム変数の幅が均等になるようにします。

これでゲーム変数が0.0~1.0に近づくほど、ヒット時のサウンドが弱~中~強へと変化します。

プロジェクトツリーのゲーム変数を選択し、インスペクターで「初期値」を変更すると再生されるトラックも変化します。

コンボ用のキューを作成

同じようにコンボ2段目、3段目のキューも作ります。

ここまで完了したら、3つのキューをまとめてコンボサウンドにするためのキューを作ります。
キューシートで右クリックし、「新規オブジェクト」→「キュー『コンボシーケンシャル』の作成」をします。

コンボ1,2,3段目のキューをドラッグアンドドロップしてトラックに配置します。

キューそのものがトラックに登録されました。上からコンボ1,2,3段目となるよう配置します。

キューは「キューリンク」という機能で呼び出されています。これはもとのキューに紐付けられているので、各キューが編集されるとコンボ用のキューにも影響を与えることになります。

インスペクターにて、「コンボ間隔」を「1000(ミリ秒)」とします。これで1秒以内に連続でキューが再生された場合、「コンボ」として異なるトラックが再生されていきます。もちろん各トラックはゲーム変数の値を反映して再生されます。

キューシートのビルド

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

UE4での実装

キューシートのインポート

ビルドしたacfファイル、acbファイルをドラッグアンドドロップしてインポートします。


プロジェクト設定を開き、

「CriWare」タブにて「AtomConfig」に先ほど書き出したacfファイルを指定します。

攻撃ヒット時にサウンドを再生する

キャラクター内に基本的な当たり判定処理を作ってみました。

ボックス型のトレースをキャラクターから進行方向に飛ばし、対象となるトレースチャンネルにヒットすればダメージが発生するものです。
ダメージを受け渡すApply Damageノードの先に、Spawn Atom Sound at Locationを配置します。

画像では発生場所にGetActorLocationを代入していますが、Break Hit Resultノードの「Locaiton」ピンを使うと正確なヒット箇所に音を配置できます。処理やゲームジャンルによって使い分けるとベターです。

この状態でテストすると、ヒット時にキューのサウンドが再生されます。1秒以内に再ヒットすると、コンボの2段目、3段目のサウンドが再生されるでしょう。

打撃の強さをゲーム変数に反映する

さて、先ほどのサンプルのグラフにも出ていましたが、今回は「AttackStrength」という変数をキャラクターに持たせています。
これはそのままキャラクターの現在の攻撃の強度となりますので、この値をADX側のゲーム変数に渡してあげるとサウンドが変化させられそうです。
ヒット音を鳴らすと同時に、Set Atom Game Variableノードを使い、ゲーム変数名と値を指定します。
名前は「HitStrength」(AtomCraftでつけた名前)、値はキャラクターの変数「AttackStrength」を代入します。
状況によって数値で補正をつけてもいいでしょう。

テスト用に、押したボタンによって攻撃の強さが変わる処理を作ります。
次のグラフでは、Input Key Z~Cを作りキーボードの対応ボタンを押した際に変数「Attack Strength」の値を変えています。この値がゲーム変数に反映され、ヒット時のサウンドが変化することになります。

(この状態でテストすると各ボタンで攻撃の打ち分けが可能になりますが、サウンドが変化しないことが一度ありました。その際一度UE4のエディタを再起動すると正常に動作しました)

ざっとコンボ中のサウンド変化、攻撃の強弱による打ち分け機能を盛り込んでみました。
さらにAisacコントロールやバスセンドなどを使い、攻撃のヒット箇所やガード時などに音が変化する、といったことも可能です。