UE5のLyraサンプルプロジェクトへCRI ADXを組み込み、自分好みのサウンド演出を実装する

# はじめに
アンリアルエンジンとサウンドミドルウェア「ADX for UE」を連携させ、UE5のサンプルプロジェクトである「Lyra Starter Game Kit」にADXを使用したサウンドを組み込んでみるチュートリアルです。

![A00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/17933797-34e5-70f0-2986-cc99685edcba.png)
「Lyra Starter Game Kit」（以下Lyra）はすぐに遊べるオーソドックスなアクションTPSであり、色々な実装を追加してテストするには最適なものとなっています。
今回は既存のゲームにADXでサウンドを組み込んでみる試みとして、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)です。

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

https://qiita.com/SigRem/items/4250925f6d66a4fd287a

**ADX2 for UE4の導入で、一歩上のサウンド表現を（実践編）**

https://qiita.com/SigRem/items/c089b71c42e898980a46


# Lyra Starter Game Kitを準備する

まずはLyraをダウンロードし、試しにテストプレイしてみましょう。

Epic Games Launcherを起動し、「マーケットプレイス」を開きます。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/75d182db-049a-f894-cbdf-e33c42e5ffb9.png)
「Lyra」を検索します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/43aea7bd-af90-e9f1-cc36-5fbec69f6c8e.png)
初回はLyraのプロジェクトを無料で購入処理し、その後「プロジェクトを作成する」ボタンを押します。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/594bfdcd-d65f-8494-0617-e9dfa0e74187.png)
エンジンのプロジェクト一覧にLyraのサンプルプロジェクトが追加されました。
ダブルクリックして起動します。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d1433d0e-657d-1d8e-6248-03ff45347818.png)
エディタが起動したら、Play in the Editorボタンを押してみましょう。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7657ee21-a4e7-a3d7-973f-8035406daa7d.png)
ゲームが始まります。F11キーで画面を最大化可能です。
最初のレベルはメニュー画面となっており、カーソルを動かして任意のレベルを選択できます。
「ELIMINATION」レベルに入ってみましょう。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/419f32b1-bcc4-e06f-5355-c8ea198c2dff.png)
ゲームが始まります。自キャラや敵がランダムにスポーンし、アリーナで戦うTPSです。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c1f875f7-77e8-857f-405f-702ee6d3a113.png)
テストプレイを終了したい時は、Escキーで開くポーズメニューから「STOP PLAY-IN-EDITOR」を選択します。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/208cf3a9-b961-f09f-db06-148b83fce057.png)


このプロジェクトに、ADXを使用したサウンドを組み込んでいきましょう。


# 実装

## プラグインの準備

まずはプロジェクトにADX for UEのプラグインを入れることが必須になります。
一度エディタを終了させます。
手順は導入編の記事にありますので、参考して導入してみてください。
ファイルをフォルダ内に移動させるだけなので簡単です。

https://qiita.com/SigRem/items/4250925f6d66a4fd287a

![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9afa0bfe-32d1-1b56-25d9-c95586181878.png)
プロジェクト起動時のダイアログは「はい」を選択します。
少し時間がかかりますが、再びLyraが起動します。


## AtomCraftで効果音を構成する

まずはADX for UEで使用するサウンドを構成できる、サウンドオーサリングツール「AtomCraft」で効果音を構成しましょう。

::: note info
もしこの工程を後で試したい、サンプルゲームへの組み込みだけ体験してみたいという方向けにサンプルのキューをビルドしたものを用意しました。こちらを使用すれば、UEでの実装だけのお試しができます。
https://drive.google.com/file/d/1YZ5_oXLTsb9XsDieo3t1M2tH0DgWjWcq/view?usp=share_link
:::

AtomCraftは「\cri\tools\ADX2\ver.3」内の「CriAtomCraft.exe」から起動できます。

### マテリアルの用意

AtomCraftを起動し、プロジェクトを作成します。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a2b2726d-f46f-443f-692a-bc87f066de8a.png)

今回は敵にダメージを与えた際のサウンドを2種類用意しました。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/864aa3cf-da7d-fc6e-bcd3-78f0f515af9a.png)
「Hit_Normal」が通常のダメージ、「Hit_WeakPoint」が弱点（頭部）にダメージを与えた際のサウンドになります。
マテリアルツリーにファイルをドラッグアンドドロップし、インポートします。

### キューの作成

ゲーム中でサウンドを再生するキューを作成します。
キューシートを右クリックし、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択します。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/cfe7e628-d7c2-dc8e-4227-605cf9e6ce56.png)
キューが作られます。ふたつ作り、それぞれ「SE_Hit_Normal」「SE_Hit_WeakPoint」と名付けました。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/cc9a324e-9da1-4b59-cb6f-30bc485fe846.png)
それぞれのキューに対応するマテリアルをドラッグアンドドロップし、タイムラインの最初に配置します。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/dfa63a0c-0739-4d31-6107-6d810a39dbf0.png)
テスト再生し、サウンドが鳴るか確かめておきましょう。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6ac3bac6-ebfb-93b3-5851-7e099e08af4c.png)



### キューシートのビルド

ここまでできたらUEにデータを持っていけるようエクスポートします。
ツールバーの「ビルド」→「Atomキューシートバイナリのビルド」を選択。
![B08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2ecd60e9-3404-cea6-c7c5-2ace2dd1a2b7.png)
「ビルド」ボタンを押してファイルをエクスポートします。
![B09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d08c236a-55bb-0190-9950-2deffda49a20.png)



## ゲームに組み込む

### キューシートをインポート

UEでLyraのプロジェクトを開きます。
コンテンツブラウザの任意の場所（「Audio」フォルダ内に「ADX_Lyra」などといったフォルダを作るといいでしょう）にビルドしたacbファイル、acfファイルをドラッグアンドドロップしてインポートします。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a181bb0b-0588-2b66-526d-ca9d4d7ad57c.png)
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e0579acc-b055-55ca-019e-ab2a6d4db0d4.png)
プロジェクト設定を開きます。「Edit」→「Project Settings」です。
![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b1d9813f-6f4a-25d9-52ee-18a6b87a7ed5.png)
「CriWare」タブの「Atom Config」にインポートしたacfファイルを指定します。
![C04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b39cea44-9147-94ad-39f7-9f786ed84e42.png)


### ブループリントの改変

いよいよサウンドを差し替えていきます。
Lyraのデータはかなり複雑な配置になっていますが、どうやら与ダメージ、被ダメージ時のサウンド処理は「**GCNL_Character_DamageTaken**」というブループリントが担っているようです。
コンテンツブラウザのルート、「All」フォルダを選択して「**GCNL_Character_DamageTaken**」を検索してみましょう。
見つかったファイルをダブルクリックして開きます。
![C05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4425d1fc-9f73-9e4f-41ea-a3fea10927fa.png)
ブループリントエディタが出てきました。My Blueprintパネルの「OnExecute」をダブルクリックすると、サウンド関係の処理が置いてある場所に辿り着きます。
![C06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/72a57fd1-b611-2907-83f5-d5bcfafd2a01.png)
「Damage Dealt Audio」とコメントされた場所を探します。
![C07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/18af8d44-1440-36d8-d572-6369d2bc43d8.png)
もし見つからない場合や面倒な場合は、Ctrl+Fキーで呼び出せる検索パネルから「Damage Dealt Audio」を検索してしまいましょう。一件見つかる「Comment」をダブルクリックすれば該当の場所に連れて行ってくれます。
![C08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/097c5ecd-4540-d7ff-6402-0638f784aead.png)

コメントされた場所の近くの空いている場所で、**Spawn Atom Sound 2D**ノードを配置します。
![C09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/091a4819-3934-d82e-85fb-01d63f3d52d7.png)
![C10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/57c37c98-a140-b5cf-8909-96d84f5c0c71.png)
「Sound」には通常ヒット用のAtomキューを指定します。
![C11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/69532327-44a4-257d-b2ce-ffc0bae1c078.png)
次の画像の位置の**Is Valid**ノードからつながるのがサウンド処理ですので、「Is Valid」アウトプットから線を伸ばして**Spawn Atom Sound 2D**の方につなぎます。
既存の処理からレールが変わり、新しい処理が行われることになります。
![C12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/69b92f7c-e936-75c4-1cea-52e5820d5692.png)
**Spawn Atom Sound 2D**ノードはボリュームやピッチなどの再生用のパラメータを必要とするので、「Params」インプットピンから線を伸ばし**Make AtomComponentParams**ノードを配置します。
![C13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/be530400-45cf-0829-c584-f41e96717de2.png)
次のようになっていれば処理はひとまず完成です。
![C14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8847052d-5373-b697-92fb-e8e738b61849.png)
この状態で一度テストしてみましょう。
敵の体に銃弾を当てると、用意したサウンドが再生されるようになっているはずです。
![C18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b5ac34b4-5f9d-5b65-d760-a485f3064f2a.png)


### 弱点ヒット用サウンドを再生する

ヘッドショットが決まった際のサウンドも再生してみましょう。
**Spawn Atom Sound 2D**ノードの「Sound」インプットピンから線を伸ばし、**Select**ノードを配置します。
![C15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5edf6af7-3f75-2ff6-ad50-78db65295217.png)
これは条件とそれに応じた出力を指定できるノードです。
次の画像の位置のノードでは弱点ヒットか否かを判定する処理が行われているので、その結果を**Select**ノードの一番下につなぎます。
![C16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a6d5fa6e-e48d-062b-73f3-37401a70cf97.png)
項目が「False」と「True」に変化するので、「False」には通常ヒット用キューを、「True」には弱点ヒット用キューを指定します。
![C17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4e29c2ea-ff49-01b0-195f-83cf2d07a605.png)

これで弱点ヒット時にはより大きなダメージを与え、専用の効果音が再生されるようになりました！
![C19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/71a9d6f2-5be7-bb25-a47d-86362e2f7357.png)



## サンプルステージの作成

テストのたびにいちいちメニューからロードを挟んでいては面倒なので、動作検証用のステージを作ってみることにしましょう。
「File」→「New Level」で新しいレベルを作成します。
![D01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c0ff6b06-0857-666b-50c8-ac90b26ed1ef.png)
テンプレートは「Basic」でいいでしょう。
![D02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c223996c-0da7-f905-81df-ff37089c9ede.png)
だだっ広い空間が現れます。
![D03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/211f733e-271f-79d7-1233-73779ca3510c.png)
まずはこのレベルを保存してしまいましょう。
「File」→「Save Current Level As」で保存します。
![D04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/94ed3e66-c162-47f3-0ecb-d71a5c6306a4.png)
他のシューター用マップと同じように、保存場所は「\All\Plugins\ShooterMaps Content\Maps」とします。
Lyraプロジェクトでは、コンテンツがプラグイン化することで整理されているためこのような配置になっているようです。
![D05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fb8a894f-8db2-d6ec-d122-51a5171b2b65.png)
World Settingsからゲームモードを指定します。
「B_ShooterGame_Elimination」がシンプルなチームデスマッチルールとなっているので、これを選びます。
![D06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3650af63-f2e4-2076-6b7a-1ebe200738a9.png)
もしWorld Settingsが見当たらない場合、「Window」→「World Settings」にチェックをつけると出現するでしょう。
![D07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/06e0baba-cdc0-487b-5a04-228bc06b09a6.png)
ゲームを再生すると、すぐにシューターゲームが開始されます。
![D08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/559b7795-ab5f-35d8-25fb-97a3f417280c.png)
オブジェクトを置いてのテストもできるので、動作チェックを都度したい場合はこのレベルを使用すると便利です。