0
0

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 2021-12-10

はじめに

アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を使って、FPSやTPSで見られる「銃弾がプレイヤーを掠める」サウンドを実装します。

当記事では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種類用意しました。これらをランダムで再生し、音が連続して再生されないようにします。
音声データをマテリアルツリーにドラッグアンドドロップしてインポートします。
A01.png
実際にゲームに実装する際はこれ以外にも発射音や着弾音が必要になりますが、記事では割愛します。

キューの作成

新規にキューを作成します。
ワークユニットツリーのキューシートを右クリックし、「新規オブジェクト」→「キュー『ランダムノーリピート』の作成」を選びます。
A02.png
「ランダムノーリピート」タイプのキューは再生するたびにランダムなトラックが呼び出され、また連続で同じトラックが再生されないという特徴があります。

キュー内にトラックを分けた状態でマテリアルを配置します。
A03.png
キューを選択した状態で、インスペクターから「パンのタイプ」を「3Dポジショニング」に設定します。
A04.png
再生するたびに異なるトラックが流れることを確認しておくといいでしょう。

また、「ピッチランダム幅」を少し上げて、再生されるピッチをランダムで上下するように設定します。
こうすることで同じ効果音でも流れたときの印象が変わり、音を繰り返し再生しても違和感が生じにくくなります。
A05.png

音声テスト

ゲーム中で聞こえる音声のテストをします。
ツールバーの「表示」→「セッションウィンドウ」をクリックしてセッションウィンドウを呼び出します。
A06.png
セッションウィンドウの下部にキューリストがあるので、キューをドラッグアンドドロップして登録します。
A07.png
最上部の「3Dポジショニング」をクリックして、3D音響のテスト機能を有効にします。
A08.png
「プレーヤーに3Dオブジェクトをアタッチ」にチェックを入れ、緑色の領域をドラッグしてサウンドを動かします。
再生してみて、音の聞こえる位置が動く様子を確認してみましょう。
A09.png

キューシートのビルド

聞こえ方が大丈夫そうならキューシートをビルドします。
A10.png
A11.png

UE4で簡単な銃弾を作成する

UE4のエディタに移動します。

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

銃弾を作成する前に、キューシートを忘れずにインポートしておきます。
ビルドしたacf、acbファイルをドラッグアンドドロップします。
B01.png
「Edit」→「Project Settings」を開き、
B02.png
「CriWare」タブにて「AtomConfig」にインポートしたacfファイルを指定します。
B03.png

銃弾用のBPを作成

銃弾となるブループリントアクターを作成します。
コンテンツブラウザの適当な場所で右クリックし、「Blueprint Class」を選びます。
B04.png
親クラスは「Actor」です。
B05.png

作成したアクターをダブルクリックして開き、「Sphere」と「Arrow」コンポーネントを追加します。
B06.png
「Sphere」は「SphereCollision」ではないほうです。メッシュ指定がされているだけで、内部的にはStaticMeshコンポーネントになります。
B09.png

Arrowコンポーネントはテスト用に銃弾の進行方向を分かりやすくするために置いているので、Detailsパネルにて「Hidden in Game」のチェックを外します。これでゲーム再生中でもArrowコンポーネントが見えるようになります。
B07.png
デフォルトだとSphereが大きいので少し縮めます。
レベルに配置すると大きさはこんな感じです(実際に置く必要はありません)。
B08.png

トレースチャンネルの用意

当たり判定の処理を作る準備として、トレース用のチャンネルを作成します。
プレイヤー用のトレースチャンネルがある場合はこの工程は省いて構いません。
プロジェクト設定を開きます。
B15.png
「Collision」ページにて、「New Trace Channel...」のボタンを押してチャンネルを追加します。
B16.png
チャンネル名は「Player」とし、「Default Response」(オブジェクトがデフォルトでとるリアクション)は「Ignore」にしておきます。手動で設定したオブジェクト以外は、このトレース判定を無視することになります。
B17.png
プレイヤーキャラクターのブループリントを開き、メインとなるコリジョンを選択します。通常はCapsule Componentなどです。
Detailsパネルの「Collision Presets」を「Custom」にし、新しく出現した「Player」の場所で「Block」にチェックを付けます。
B18.png
これでプレイヤーキャラクターだけは銃弾の当たり判定に反応することになります。

銃弾の推進

作成した銃弾アクターに戻ります。
Event Tickから処理を開始し、Sequenceノードを置きます。
これは今回処理を整理するために使用していますが、上のピンから処理が順番に行われるノードです。
B10.png
AddActorLocalOffsetノードでお手軽に銃弾を飛ばすことができます(Projectile Movement Componentも使用できますが、設定項目が多いため今回は簡易な処理にしています)。
B11.png
黄色い「Delta Locaiton」を右クリックし、「Split Strcut Pin」を選択します。
B12.png
3つのfloatピンに分かれるので、一番上の「Delta Location X」を右クリックして「Promote to Variable」を選択します。
B13.png
新しくfloat変数が作られます。これが銃弾の推進スピードになります。
B14.png

トレースによる掠め判定、サウンドの再生

Sequenceノードの下側には銃弾の当たり判定(今回は掠め判定)を作っていきます。
判定の肝はMultiSphereTraceByChannelノードです。
B19.png
球形の判定を展開するノードです。今回はアクターを中心に単純な球で展開したいので、「Start」と「End」ピンにはGetActorLocationノードをつなぎ、半径となる「Radius」にはとりあえず「150」を入力します。
テストに便利なので、「Draw Debug Type」は**「For One Frame」にしておきましょう。
B20.png
MultiSphereTraceByChannelの後に
For Each Loopノードを置きます。
B21.png
次の画像のように
Branchノードを挟み、トレースにオブジェクトが引っかかったら次の処理にいくようにします。
B22.png
For Each Loopノードの「Array Element」ピンから線を伸ばし、「Break Hit Result」を選択します。
B23.png
次のようにつなげば、トレースが感知したオブジェクトがプレイヤーキャラクターかどうかを判定できます。
B24.png
もしプレイヤーだった場合、Add Atom Componentで銃弾が掠めた際のサウンドを再生します。Atomコンポーネントはこのアクターに追加されるため、3Dサウンドとして設定されていれば銃弾がプレイヤーの後方に飛んでいった際も立体的に聞こえてくれるはずです。
この処理がひとつの銃弾に対して連続して実行されないよう
Do Once**ノードを挟みます。
B25.png
Add Atom Componentノードを選択すると、Detailsパネルにてサウンドの設定ができます。
忘れずにAtomCraftで構成したAtomキューを指定しましょう。
B26.png
ノードの全体図はこんな感じです。
B27.png

テスト用にスポーンする

銃弾は完成しましたが、発射機構がないためレベル上で直接スポーンできるようにします。

レベルに「TargetPoint」アクターを配置します。「Place Actors」のパネルにあります。
B28.png
レベルブループリントを開きます。
B29.png
キーが押されたことを判定するイベント、Input Keyイベントを配置します。今回はRキーにしました。
B30.png
レベル上で「TargetPoint」アクターを選択し、レベルブループリントで右クリックし「Create a Reference to TargetPoint」でリファレンスノードを作ります。
B31.png
Spawn Actor from Classノードでアクターをスポーンします。
B32.png
スポーン先はGet TargetPointから線を伸ばしGet Actor Transformで「TargetPoint」アクターの座標や回転を代入します。
B33.png
銃弾アクターのスピードを上げておき、トレース範囲も拡大します。
B34.png
ゲームを再生し、Rキーを押すと「TargetPoint」アクターの位置から銃弾が発射されます。近くまで行きトレース範囲に重なると、銃弾が掠める音が発射されるはずです。
B35.png

AtomCraftでパラメータを追加すれば、音のくぐもり方や距離による減衰が細かく設定できます。
こだわりのサウンドを作り、臨場感のある戦場を作ってみてはどうでしょうか。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?