LoginSignup
0
0

More than 1 year has passed since last update.

UE5のLyraサンプルプロジェクトへCRI ADXを組み込み、音によるゲーム要素を追加する

Last updated at Posted at 2022-11-15

はじめに

アンリアルエンジンとサウンドミドルウェア「ADX for UE」を連携させ、UE5のサンプルプロジェクトである「Lyra Starter Game Kit」にサウンドを利用した遊びを追加するチュートリアルです。

「Lyra Starter Game Kit」はアクションTPSのプロジェクトとなっています。
こうしたゲームでは音による索敵が重要な要素になっていますが、プレイヤーの能力として「発動すると離れた敵から音が聞こえるようになり、索敵が有利になる」というものを足して遊びに変化を加えてみます。
B37.png

「Lyra Starter Game Kit」(以下Lyra)へのサウンド組み込み基礎については、次の記事で解説しています。
ざっと読んでおくと本記事が分かりやすいかもしれません。

前提

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

なお、ADX2は「ADX」へ名称が変更になりましたが、ツール構成は変更ありません(2がないから古いほう、というわけではありません)。

記事執筆時点のADX for UEのSDKバージョンはADX LE UE SDK(1.31.00.01)です。

ADX for UEの導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)

ADX for UEの導入で、一歩上のサウンド表現を(実践編)

実装

AtomCraftで索敵音を準備する

AtomCraftを起動し、プロジェクトを用意します。

マテリアルの用意

索敵した際に敵から聞こえてくる音を用意します。ループする音が望ましいでしょう。
A01.png
(Lyraサンプルへの組み込み記事で使用したプロジェクトにサウンドを追加しました)
インポートしたマテリアルを選択し、インスペクターにてループ情報の上書きを「True」に、ループタイプを「ループ」に設定します。
A02.png
再生して、マテリアル自体がループするか確認しておくといいでしょう。

キューの作成

キューを作成します。
キューシートを選択し、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選びます。
A03.png
作成したキューにマテリアルをドラッグアンドドロップして配置します。
A04.png

3Dサウンドの設定

敵がいる方向や距離が分かるよう、3D空間上で聞こえる音の設定をします。
キューを選択し、インスペクターにてパンタイプを「3Dポジショニング」に変更します。
A05.png

3D空間で音がどう聞こえるかテストするためには、セッションウィンドウを使用します。
ツールバーの「表示」→「セッションウィンドウ」を選択して呼び出します。
A06.png
A07.png
キューシートからキューを、セッションウィンドウのリストにドラッグアンドドロップして登録します。
A08.png
A09.png
上部の「3Dポジショニング」をクリックすると緑色の領域が現れ、3Dポジショニングをプレビューすることができるようになります。
A10.png
「プレーヤーに3Dオブジェクトをアタッチ」にチェックを入れます。
A11.png
再生しながら緑色の場所でドラッグすると、音の位置を変化させながら聞こえ方が確認できます。
A12.png
キューを選択している状態であれば、インスペクターの3Dポジショニングに関する設定がセッションウィンドウにも反映されます。耳で聞きながらパラメータを設定してみましょう(デフォルトでもテストするぶんには問題ありません)。
A13.png

キューシートのビルド

満足のいく設定ができたらキューシートをビルドします。
ビルド用のウィンドウはツールバーの「ビルド」→「Atomキューシートバイナリのビルド」から呼び出せます。
A14.png
A15.png

UE5でLyraに索敵機能を実装する

ここからLyraプロジェクトのUE5エディタへと移動します。

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

ビルドしたキューシートをインポートします。
コンテンツブラウザの任意の場所に、acfファイル、acbファイルをインポートします。
B01.png
B02.png

余談ですが、キューの数が多くなってくると管理が大変になります。キューシートのみをインポートし、アセットを整理するテクニックを過去の記事にて紹介しています。

もしプロジェクトにacfファイルを設定していない場合、Project Setttingsから指定しておきましょう。
B03.png
B04.png
既に指定済みの場合、この工程は不要です。

敵キャラクターに索敵サウンドを追加する

キャラクターのスポーン時に、もし敵チームであれば索敵用のAtomコンポーネントを追加します。
プレイヤーキャラクターは「B_Hero_ShooterMannequin」というブループリントアクターが担っています。
コンテンツブラウザでルートである「All」フォルダを選択し、「B_Hero_ShooterMannequin」を検索します。
B05.png
ヒットしたアクターをダブルクリックして開きます。
ここも複雑なブループリントが並んでいるようですが、キャラクターのチームが設定された際に「OnTeamOrCosmeticsChanged」という関数(Function)が走るようになっています。ダブルクリックして開いてみましょう。
B06.png
この関数でキャラクターをチームカラーに塗ったりする処理が行われているようです。
B07.png
ここにBranchノードでチームを判定する処理を追加します。
手頃なSequenceノードがあります。これは繋がれているノードを上から順に処理していくもので、ノード整理に役立ちます。
ノードの「+」を押し、処理の項目を追加します。
B08.png
BranchノードでチームのIDを判定します。チームIDは関数に渡されていますので、線を伸ばして取得します。
Lyraでは味方チームに「1」、敵チームに「2」というIDが割り振られています。
つまりチームのIDが「2」になっているか判定します。
B09.png
結果が「True」であれば敵チームなので、サウンドを再生するためのAtomコンポーネントを追加します。
Add Atom Componentノードを検索して配置します。
B10.png
B11.png
ノードを選択した状態で、DetailsパネルにてAtomCraftで設定したキューを指定します。
B12.png

テスト用マップの設定

そのままテストしてもいいですが、テスト用マップで敵が動き回るよう設定してみたほうが効果が分かりやすそうです。
「Lyra Player Start」アクターをマップに配置すると、指定した位置にキャラクターがスポーンします。
B13.png
2つ配置することで、チームごとに異なる場所からスポーンするようになります。
B14.png
「NavMeshBoundsVolume」を配置すると、指定した範囲内で味方や敵のAIが動き回ることができるようになります。
B15.png
配置後自由に大きさを変えられます。
B16.png
テストしてみましょう。敵の位置から音が出ているのが分かるかと思います。
もし音量などが合っていないと感じる場合、AtomCraftで再度調整してみましょう。
B17.png
コンソールコマンド「cri.ShowSoundLocation 1」を使用すると、Atomコンポーネントで再生されているサウンドの位置が可視化されます。便利なので使っていきましょう。
B18.png

キーを押して索敵能力を発動する

さて、このままではサウンドが鳴りっぱなしなのでキー入力に反応してサウンドが呼び出されるよう処理を改善していきます。
まずはSet Volumeで追加したサウンドをすぐボリューム0にする処理です。
B19.png
Add Atom Componentの青いアウトプットピンを右クリックし、「Promote to Variable」を選択します。
B19b.png
これにより、追加したAtomコンポーネントが変数化され他の場所から参照できるようになります。
分かりやすい名前をつけておきましょう。
B19c.png

プロジェクト設定にて索敵能力用のキー入力を追加します。
「Input」タブにて、「Action Mappings」の場所にある+ボタンでアクションを追加します。
B20.png
名前をつけ、任意のキーを設定します。今回はTキーとしました。
B21.png

「B_Hero_ShooterMannequin」に戻り、「EventGraph」をダブルクリックしてイベントグラフに移動します。
B22.png
空いている場所で右クリックし、「Add Custom Event」でカスタムイベントを追加します。
サウンドを再生するためのイベントになります。
B23.png
「PlaySearchSound」と名前をつけました。
B24.png
Is ValidでAtomコンポーネントが有効かを判定します。味方の場合はAtomコンポーネントが追加されておらず、そのまま参照しようとするとエラーが出てしまうためです。
B25.png
サウンドのボリューム変化をなめらかに行うため、タイムラインノードを追加します。
B26.png
ノードに名前をつけます。
Branchノードからの線は「Play from Start」につなげます
B27.png
タイムラインノードをダブルクリックして開きます。
「Add Float Track」でFloat変数を扱うトラックを追加します。
B28.png
トラックにキーを追加していきます。
B29.png
適当なグラフを作ります。最終的にボリュームが0に減衰すればOKです。
B30.png
タイムラインノードの「Update」時に、Set Volumeでボリュームを変化させます。
B31.png

Input Actionノードで、キーが入力された際のイベントを追加します。
B32.png
B33.png
Get All Actors Of Classでキャラクターすべてを取得します。「Actor Class」にはキャラクターのクラスである「B_Hero_ShooterMannequin」を指定します。
B34.png
For Each Loopノードですべてのキャラクターに対し処理を実行します。
B35.png
すべてのキャラクターに対し、「PlaySearchSound」イベントを実行すれば処理は完成です。
B36.png

テストしてみましょう。キーを押してから少しの間だけ、敵から音が聞こえるようになるはずです。
B37.png

サウンドによる遊びの要素が追加できました。
オーソドックスなゲームプレイに、こうした聴覚からのアプローチを加えてみるのも面白いかと思います。

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