ADX+UE5で3Dサウンド（音響）を実装する（改訂版）

# はじめに
ADXアンバサダーとして執筆しておりますSigと申します。
この記事では、アンリアルエンジン5とサウンドミドルウェア「ADX for UE」を連携させ、
ゲーム中の3D空間におけるサウンド挙動を細かく設定し再生します。
サウンドオーサリングツール「AtomCraft」で実際の聞こえ方を確認しながら音の調整が可能です。
また、ADX新バージョンに搭載された「Atom Attenuation」アセットを使い、UE5側でサウンドの距離減衰を細かく設定することもできるようになりました。

ゲーム上でプレイヤー（カメラ）の位置が音源から近ければ音は大きく再生され、遠ければ小さく聞こえるようになり、さらに音源のある方向のスピーカーから音が大きく再生されます。
また音源となるオブジェクトが移動した場合音の聞こえ具合が変わり、視覚に頼らずともものが移動したことを伝えることができます。
環境音以外にも、重要な情報を含む会話ボイスの強調やホラーゲームの演出などにも役立ちます。
FPSやTPSなどの索敵が重要なゲームにおいて、プレイヤーに敵の足音から位置を推理させる、などのゲームプレイにもつなげることができるでしょう。

補足ですが、UE5にはデフォルトでもサウンドの距離減衰（Sound Attenuation)機能があります。
インポートしたサウンドに対して手動で設定を変更することで使用することができます。
https://docs.unrealengine.com/ja/Engine/Audio/DistanceModelAttenuation/index.html


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

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

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

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



# やること
- AtomCraftでキューを作成
- 3Dサウンドのパラメータ設定
- UE5にインポート
- ブループリントなどで再生する


# AtomCraftから距離減衰を設定する

## AtomCraft側
### キューの作成
新規にキューを作成します。タイプはとりあえず「ポリフォニック」にします。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e22bf5bf-7c2d-7c89-e80f-ee7b7be664eb.png)
キューに音源を追加します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/960cfbea-48d5-9ca5-8846-c5a49d428946.png)
ゲーム中にサウンドの再生位置を移動させて鳴り具合を確認したいので、ループする環境音などが望ましいでしょう。
サウンドをループさせるには、「マテリアルツリー」の該当する音源を選択し、インスペクターで「ループ情報の上書き」をTrueにします。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d068efb3-d902-5367-a986-96fd5c6bdf00.png)


### 3Dサウンドの設定
キュー内に配置したウェーブフォーム（音源）はデフォルトでは2Dで再生されるようになっているので、3D空間を加味した再生がされるよう設定してあげる必要があります。
キュー内にあるウェーブフォームをクリックして選択します。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b4f22ca4-d758-8e33-ef78-0267acc64bc2.png)
インスペクターで「ボイス」→「キューのタイプ」を「3Dポジショニング」にします。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/05a235d9-3dca-d610-5bf6-4dbfeffd32cf.png)

これで空間内の位置を反映したサウンドになりましたが、テスト再生で確認するには「セッションウィンドウ」を使う必要があります。
ツールバーの「表示」→「セッションウィンドウ」をクリックして呼び出します。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/621a2638-085b-ac64-1ca6-cc4460635a1d.png)
セッションウィンドウが開くので、再生リストに作成したキューをドラッグアンドドロップします。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2e55aad9-b328-e84c-99b2-43cbfb435bfa.png)
「3Dポジショニング」のボタンを押すと、音源を移動して再生できる画面を呼び出せます。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a1bacfe4-a247-ebc2-3e3a-95d6eec2c377.png)
再生ボタンを押して確認します。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/21af18a7-cf0d-0771-0e04-65a53b973d49.png)
3Dポジショニング画面をドラッグして、再生位置が変わるのを確認します。ヘッドホンなどを使用して聴いてみましょう。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e3c19003-8473-569f-efdc-9d019c56cd21.png)
数値をスライダーで変更することでも、音源の位置を変えることができます。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/29dc4bd2-9b9f-3410-78f9-4ef7782b8ead.png)
また、「ターゲット」を「リスナー」にすると音声を聞く側の座標を変えられます。
![A12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a8987647-4dfb-0486-da1e-934685282707.png)

### 3Dサウンドを調整する
3D空間上での聞こえ方を調整するには、インスペクターの「パン[3D]」をクリックします。
![A13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/59eff312-1094-7d8e-df8d-40bafaab7f8c.png)
様々な設定項目がありますが、距離減衰の設定が分かりやすいでしょう。
![A14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6297346c-b0ae-460f-1fd7-258e353243fe.png)
最小を上げると減衰開始距離までが長くなり、少し離れていても最大音量で聞こえるようになります。
逆に最大を下げると完全に減衰する距離が近くなり、遠くで音が聞こえにくくなります。
![A15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b60ab446-40e6-5085-53d7-b55b275426b9.png)
（画像はUE4でキャプチャした画像を元に作成したものですが、考え方は変わりません）

設定が終わったら、キューシートをビルドしてエクスポートします。


## UE5での再生

### キューシートのインポート
AtomCraftでビルドしたacf、acbファイルをUE5にインポートします。
コンテンツブラウザ（コンテンツドロワー）上へファイルをドラッグ&ドロップします。

ダイアログに対しては「Yes」を選択します。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/46930cca-6b9f-9618-6349-a411038bb685.png)
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f1d2dca7-1061-f2b6-eaf0-29f987594cb3.png)
コンテンツブラウザ上にアセットとして登録されます。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/43ab1a73-5759-2a87-521c-438469be84fb.png)
キューはAtom Cue Sheetアセットの内部に格納されています。ダブルクリックで開くと確認できます。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e7103b2b-4898-c426-30d2-3ab4a9819c8e.png)


### レベルに配置する
まずは確認のために、Atom Cueを直接レベルに置いてみます。
コンテンツブラウザからドラッグアンドドロップします。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/eb0be2db-4046-2faa-e3f3-b76066f53051.png)

Playボタンを押してゲームを再生します。

現状ではプレイヤーが移動しても、距離によって聞こえ方が変化しないかと思います。

# 「Atom Attenuation」アセットによる距離減衰
「**Atom Attenuation**」アセットを使用して、サウンドに距離減衰を与えてみましょう。
コンテンツブラウザで右クリックし、「ADX Atom」→「Spatialization」→「Atom Attenuation」を選択します。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/236bf23d-e0a5-e47c-0931-195d9f0ed077.png)
新規に「Atom Attenuation」アセットが作成されました。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/df9fdb98-9340-6e56-eea5-b63ed4d9cfa7.png)

ダブルクリックして開くと、様々な数値を編集してサウンドの減衰距離などを指定できるようになっています。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3b6877f4-b981-e7d6-a821-e3a5909e4b9e.png)
レベルに配置したキューのDetailsパネルにて、「Attenuation Settings」に作成した「Atom Attenuation」アセットを指定します。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9a7987a0-9d0a-25aa-6f29-393244379db5.png)

これでプレイヤーキャラを移動させると、距離減衰が反映されるように聞こえるようになったはずです。
サウンドの位置を確認したい場合は、コンソールコマンド「atom.3dVisualize.Active Sounds 1」と入力すると表示されるようになります。
コンソールコマンド「atom.3dVisualize.Active Sounds 0」で表示を無効化します。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f00ddaa4-84ba-7469-22b1-f4e0d91ac0e5.png)
「F8」キーを押すと、Play in Editor中にもサウンドを選択して、位置を動かすことができます。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/79f725a8-d028-2e77-a124-64bf48691d85.png)
これによってプレイヤーキャラとサウンドの位置関係が変わっても、同じように距離減衰がはたらくことが確認できるでしょう。

さらに、キューシート内のキューアセットに直接「Atom Attenuation」アセットを指定することもできます。
これにより、このキューでは常に同じ距離減衰設定を使うことも可能です。
プレイヤーのアクションなど、よく使用される効果音にはこの手法で減衰を設定しておくと便利かもしれません。



# 「Override Attenuation」による距離減衰
「Atom Attenuation」アセットを用意しなくても、サウンドごとに個別に距離減衰を設定することも可能です。
レベル上に配置したキューのDetailsパネルから、「Override Attenuation」にチェックを入れます。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a54f4ab9-fb08-c914-eef2-63273444aacf.png)
このキューだけの距離減衰設定をする項目が現れます。
一箇所だけ特殊な減衰を演出したい場合はこの手法を使い、通常のサウンドに対しては「Atom Attenuation」アセットを使用して減衰設定を使いまわしていくといいでしょう。
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7a369f60-4656-ce02-96d9-6fcfdcbc5eeb.png)




# 補足：キャラクターのアニメーションにサウンドを埋め込む
足音など、キャラクターのアニメーション内で任意のタイミングに合わせてサウンドを再生することもできます。
コンテンツブラウザでアニメーションを開きます。
![D01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/84265aa0-f9a3-4d91-a98a-52f74ca97571.png)
![D02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/cf529948-03c1-5303-65e5-5b236d0b5f95.png)

「Notifies」内の任意のトラックで右クリックし、「PlayAtomCue」を選択すると、そのタイミングにAtom Cueが配置されます。
![D03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/48eacf6b-aa52-c21e-17d6-571de392e69d.png)
配置したAtom Cueを選択した状態で、Detailsパネルで再生する音の指定などが行なえます。
![D04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/bb827c26-6e6d-245c-44ed-0c78622dd582.png)

編集したアニメーションをレベル上にドラッグアンドドロップして配置します。
![D05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b05c746a-045a-3e2c-c3e0-4d6efae1fbf1.png)

この状態でゲームを再生して、配置されたキャラクターの周りを移動すると、音の位置やタイミングが反映されているのが確認できます。
![D06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/81966bc8-1db8-8234-6540-be72013370d1.png)
もちろん、プレイヤーのアニメーションにもサウンドの埋め込みが適用されます。
![D07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8851f19a-cf4a-dbb2-e508-e6235bdb98b2.png)