ADX for UEで、サウンドの距離減衰設定などをランタイムで変更する

# はじめに
アンリアルエンジンとサウンドミドルウェア「ADX for UE」を連携させ、再生されているサウンドの距離減衰などの設定をランタイムで変更します。

「クリーチャーが巨大化し鳴き声が遠くまで聞こえるようになる」「遠くにいるキャラクターが拡声器を使う」「機器が故障し、遠くまでサイレンが届かなくなる」などといったシチュエーションに効果を発揮しそうです。


# 前提

当記事では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の導入で、一歩上のサウンド表現を（導入編）**

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

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

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


# 実装

## サウンドを配置し、再生を確認する

まずはレベル上にキューを配置し、再生を確認します。
ループするBGMや環境音かつ、3DサウンドとしてAtomCraftで設定されているものが望ましいです。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c7cb79e8-40e7-8ab6-e384-4ab66332c44f.png)
この時点でサウンドが流れるか、一度ゲームを再生して確認します。3Dサウンドになっていて、離れると音量が減衰していればOKです。


## サウンドの減衰設定を上書きする

ブループリントを使い、キューの距離減衰設定を上書きしてみましょう。

**キューを選択した状態で**、レベルブループリントを開きます。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/364fe070-f02d-4bee-d1b7-7abd46038bbb.png)
イベントグラフの空いている場所で右クリックし、「Crete a Reference to （キュー名）」を選択します。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9b1eb342-201b-936d-0207-eaeee9c91e35.png)
レベル上に配置したキューのリファレンス（参照）ノードが作られます。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f290d396-0e2f-a4fc-ed7e-af281f6078b7.png)
**Input Key 1**イベントノードを新規に作成します。「1」キーを押したら開始されるイベントです。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/40494471-d473-c64d-3199-28a34a903806.png)
リファレンスノードから線を伸ばし、**Adjust Attenuation**ノードを配置します。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f80a608c-3781-9612-696a-2bc4ee40c305.png)
これが今回の処理のメインとなります。**Adjust Attenuation**ノードは、任意で様々な設定のサウンドの減衰やその他の設定が可能です。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1d6fb49f-8e67-4ce1-23ae-91f5387a11bd.png)
「In Attenuation Settings」から線を伸ばし、**Make SoundAttenuationSettings**ノードを作ります。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/893d89c2-0097-1d32-c794-b83137d8f921.png)
ノード下部の↓をクリックすると、かなりの量のオプションが出てきます。
編集しないときは畳んでおきましょう。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/77dbb14e-b060-19aa-7fab-1e5ad6125b3b.png)

機能を試してみましょう。
「Enable Volume Attenuation」のチェックを外します。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4fef099a-1a23-20f6-222e-b9821b517b89.png)
コンパイルし、ゲームを再生します。
「1」キーを押すとサウンドの減衰設定が無効化され、どこにいても同じ音量でキューの音が聞こえてくるようになります。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/25cd59af-06ac-5816-0cb8-e0025220a51a.png)
画像ではデバッグ用の描画を使用しています。
コンソールコマンド「cri. ShowSoundLocation 1」を入力すると有効化されます。


## 減衰設定を詳細に設定する

**Make SoundAttenuationSettings**ノードでは多くのパラメータを操作可能です。
チェックボックス以外も試してみましょう。
まずは先ほどの「Enable Volume Attenuation」のチェックを外したままだと減衰設定が機能しないので、**ふたたびチェックを入れておきます**。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b8c48c67-4644-0df0-ee2e-a86a1dc954c2.png)
ノードの下の方にある「Falloff Distance」の数値を小さくすると減衰が強くなり、少し離れると聞こえなくなるような幽かな音に変化します。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/518abd1f-b60c-b0b7-73b4-605e2614ef5d.png)
「1」キーを押してイベントを起動する前はこの距離でも聞こえますが……
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a5a96829-daba-348b-bbcc-6736ae853611.png)
「1」キーを押し減衰設定を上書きすると、この距離でも聞こえにくくなってしまいます。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fde8cc61-f69b-7b0b-2e0f-af7f53762800.png)
描画されているデバッグ情報からも、音の聞こえる範囲が狭くなったことが分かります。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/dece5eec-0ca1-d765-e6d0-eccc145fb254.png)



## 減衰設定を変数に保存しておく

**Make SoundAttenuationSettings**ノードで設定した内容は変数化して、ゲーム中に記憶しておいたり別の場所からアクセスすることが可能です。
アウトプットピンを右クリックして「Promote to Variable」で変数化します。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5510db6d-db0c-50a3-0303-ee65f3ac3b8f.png)
**Set**ノードが作られ、このタイミングで設定が変数に保存されます。
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/926d2be4-92ae-9304-14cc-3d35231ec9f5.png)
別のキューに対して、記憶した減衰設定を適用可能です。
![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/cd7ec95f-a19c-16c2-7e28-98e503d1daae.png)
また、Array（配列変数）を使えば複数のキューに対して一括で同じ減衰設定を適用することも可能です。
![C04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/cf2b6775-5bd1-d9fc-e13c-8b062764d0cd.png)


## 補足

**Make SoundAttenuationSettings**ノードでは減衰だけでなく、壁の向こうから聞こえてくる音をくぐもらせる**オクルージョン**機能や音を反響させる**リバーブ**機能などの有効/無効、効果の度合いなどがランタイムで変更可能です。

「Enable Occlusion」にチェックを入れ、「Occlusion Volume Attenuation」の数値を下げると……
![D00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/90eed825-d83d-e264-d668-c2883c0483aa.png)
![D01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/212dc733-e0dc-6b6c-8c8f-d0ceaedeeaec.png)
壁に隠れた音が聞こえにくくなります。
「Occlusion Volume Attenuation」を操作すれば音がくぐもる効果が追加されます。
![D02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e3fb1c10-a289-32e4-d16b-9d191e32c9de.png)


ゲーム中の様々なサウンド変化を演出してみましょう。