LoginSignup
1
0

More than 3 years have passed since last update.

ADX2+UE4で、地形ごとに異なる足音を再生する

Last updated at Posted at 2021-03-31

はじめに

アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を連携させ、キャラクターが踏んだ場所の材質に対応した足音が再生されるようにします。

AnimNofityとPhysicsMaterialのあわせ技により、キャラクターのアニメーションとしたサウンド再生、状況にあった音の選択を可能にします。

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

前提

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

実装

AtomCraftで足音を準備する

まずはAtomCraftで足音となるキューを準備します。

マテリアルの用意

マテリアルツリーにドラッグアンドドロップして音源をインポートします。
今回は3種類の足音に、それぞれいくつかのバリエーションを用意しました。
A01.png
ファイル名のとおり、コンクリート、草の生えた地面、金属を踏んだ際の効果音となっています。
ランダムに再生することで、何度も再生された際の単調さを解決できるでしょう。

キューの作成

新規にキューを作成します。「新規オブジェクト」→「キュー『ランダムノーリピート』の作成」を選択します。
A02.png
「ランダムノーリピート」のキュータイプは、ランダムなトラックが再生される「ランダム」と基本的に同様ですが、前回と同じトラックは再生されないという特徴があります。
これを繰り返し、各材質用にキューを用意します。
A03.png
マテリアルツリーからサウンドをドラッグアンドドロップし、それぞれ別のトラックに配置します。
A04.png
再生ボタンを押すと、そのたびに違う音(トラック)が再生されるはずです。
A05.png

3Dサウンドの設定

音に臨場感を与えるため、キューが3D空間上で再生された場合の減衰を設定します。
キューを選択し、インスペクターにて「パンのタイプ」を「3Dポジショニング」に変更します。
A06.png
インスペクター下部で「3Dポジショニング」のボタンを押すことで、距離減衰やドップラー等の設定ができます。
A11.png
実際の聞こえ方を確認するには、セッションウィンドウを使用します。
ツールバーの「表示」→「セッションウィンドウ」から呼び出せます。
A07.png
セッションウィンドウの「3Dポジショニング」を押し、「プレーヤーに3Dオブジェクトをアタッチ」のチェックボックスをONにすると距離による音の変化が確認できます。
A08.png
緑色の領域をドラッグすることで音の位置関係を変化させることができます。

キューシートのビルド

調整ができたら、キューシートをビルドします。
A09.png
A10.png

アニメーションによる足音の再生

UE4に組み込み、実際にサウンドの再生と足音の変化を実装していきます。

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

コンテンツブラウザにビルドしたキューシート(acfファイル、acbファイル)をインポートします。
B01.png
再生するたびに違うトラックが聞こえることを確認します。
B02.png

アニメーションにイベントを埋め込む

UE4のスターターアセットに入っているマネキンの走りアニメーションに、足音を再生させるためのイベントを埋め込みます。
アニメーションから呼び出すイベントは。「Notify」(通知)と呼ばれます。アニメーション内の任意のタイミングで足音を鳴らす「Notify」を発火することで、足音の実装に繋げます。

走りアニメーションは、ThirdPersonTemplateからプロジェクトを作成していれば、(プロジェクトフォルダ)\Content\Mannequin\Animationsに「ThirdPersonRun」が入っているはずです。
B03.png

もしテンプレートが異なる場合、コンテンツブラウザの「Add/Import」→「Add Feature or Content Pack」でウィンドウを開き、「ThirdPerson」を「+Add to Project」することでアセットを追加することができます。
B04.png
B05.png

「ThirdPersonRun」をダブルクリックして開きます。
再生を止め、タイムラインをドラッグして片足が接地したタイミングまで持っていきます。
B06.png
「Notifies」のトラックで右クリックし、「Add Notify」→「New Notify」を選択します。
B07.png
左足が接地しているので「FootStep_L」と名前をつけました。
B08.png
同じようにタイムラインを右足が接地しているタイミングまで動かし、「Add Notify」→「New Notify」から「FootStep_R」を作成します。
B09.png
一度作成したNotifyは、「Add Notify」→「Skeleton Notifies」から同じものを作ることができます。
B10.png

走りアニメーションはループ再生されるため、これで一歩ごとに右足と左足のNotifyが交互に発火されることになります。
右足と左足でNotifyを分けるのは、足元の材質を判定するために、踏みしめた足を判別するためです。この後の実装を実際にしてみると分かりやすいかと思います。

AnimNotifyイベントから音を再生する

アニメーションエディタの右上の「Blueprint」をクリックすると、スケルトンに対応したアニメーションブループリントが開きます。
B11.png
「Event Graph」をクリックしてイベントグラフに移動します。
B12.png
グラフの空いている場所で右クリックして、検索欄のテキストボックスに「notify」と入力すると、先ほどアニメーションに埋め込んだNotifyが出てきます。
B13.png
これらをクリックし、ふたつのイベントを作成します。
B14.png

ADX2LEにはバージョンアップにより新しく追加されたノードPlaySoundForAnimNotifyがあります。これはAnimNotifyから起動されるサウンドを想定した機能を持っていますが、キューの初期パラメータや後天的な挙動の変動ができません。今回は足音にセレクタやAisacコントロールなどの変動する機能を使っていないため、このノードを使用します。

PlaySoundForAnimNotifyをイベントから繋げます。再生するキューは、ひとまず適当なものを設定しておきます。
B15.png
キャラクターから足音が聞こえるようにするには、「Attach to Component」にキャラクターのメッシュなどのコンポーネントを指定してあげる必要があります。

キャラクターのメッシュを取得してみましょう。
イベントグラフの別の場所で右クリックし、Event Blueprint Begin Playというイベントを作成します。
B16.png
Try Get Pawn Ownerノードを配置し、「Return Value」ピンから線を引き出し、Cast To (キャラクタークラス名)を作ることでキャラクタークラスにアクセスできるようになります。
B17.png
「As (キャラクタークラス名)」の青いピンを右クリックし、「Promote to Variable」で変数化します。
B18.png
新しく変数が作られるので、適当に名前を付けます。今回は「OwnerChar」としました。
B19.png
Get OwnerCharGet Meshノードでキャラクターのメッシュコンポーネントが取得できるため、それぞれ右足と左足のPlaySoundForAnimNotifyに繋ぎます。
B20.png
テストプレイしてみると、走っているキャラクターから足音が鳴っているはずです。
B21.png

PhysicalMaterialを作成する

PhysicalMaterialを使ってマテリアルごとに足音を設定できるようにしてみましょう。
コンテンツブラウザの任意の場所で右クリックし、「Physics」→「Physical Material」を選択します。
B22.png
「PhysicalMaterial」を選択した状態で「Select」をクリックします。
B23.png
今回は「Concrete」「Grass」「Metal」の3つのPhysicalMaterialを作りました。
B24.png
PhysicalMaterialを開けば、摩擦などの設定をすることも可能です。

トレースによってPhysicalMaterialを取得し、音を変化させる

アニメーションブループリントのグラフに戻ります。
直接開く場合、コンテンツブラウザの「ThirdPerson_AnimBP」をダブルクリックします。
B25.png
今回は足元の材質の判別を、足からレイ(線)を飛ばして衝突した箇所のPhysicalMaterialを取得する方法で行います。
B44.png

LineTraceByChannelノードを配置します。
B26.png
B27.png
キャラクターの足から地面へ向かってトレースを飛ばすため、開始地点はキャラクターメッシュの足ボーンを参照します。
Get Socket Locationでボーンまたはソケットの座標を取得できます。LineTraceByChannelの「Start」ピンに繋ぎます。
マネキンのメッシュの場合、左足のボーンは「foot_l」です。
B28.png
トレースの終端は足ボーンの少しだけ下なので、Z軸を「-30」した座標を指定します。
B29.png
LineTraceByChannelの「Return Value」からはトレースがヒットしたか、「Out Hit」からはトレースがヒットした場所の様々な情報が返されます。それぞれBranchBreakノードを繋ぎます。
B30.png

「Phys Mat」ピンからはトレースがヒットした場所のPhysicalMaterialが取得できます。
今回欲しい情報はPhysicalMaterialの名前だけなので、Get Object Nameノードを配置します。
B31.png
PhysicalMaterialの名前ごとに処理を分岐させたいので、Switch on Stringノードを使います。
B32.png
それぞれが対応する足音を再生するPlaySoundForAnimNotifyノードに繋げます。
B33.png
「Attach to Component」ピンにキャラクターのメッシュを参照させます。
B34.png
右足についても、同じように処理を組みます。
B35.png
ノードをコピペしても大丈夫ですが、右足のボーン名「foot_r」を指定することを忘れないでください。
B37.png
LineTraceByChannelノードの「Draw Debug Type」を「For Duration」にしておくと、トレースが視覚化されるためテストに役立ちます。
B36.png

レベル上の地形にPhysicalMaterialを指定します。
メッシュを指定し、Detailsパネルにて「Phys Material Override」で設定することもできますし、
B38.png
マテリアルインスタンスにて「Phys Material」で設定することもできます。
B39.png
両方設定した場合、前者が優先されます。

テストしてみましょう。キャラクターが走ると足からトレースが視覚化された線が出現します。
ヒットした場所で四角のマーカーが出ます。
B40.png
B41.png

材質の異なる場所では違う足音が再生されるはずです。
B42.png

補足ですが、Switch on Stringノードの「Default」ピンに再生処理を繋いでおけば、PhysicalMaterialが未設定や例外の地形でも鳴らす足音を指定できます。
B43.png

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