ADX2+UE4で、屋内の音響をデザインする（前編）

# はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を連携させ、家の中や洞窟の中など、閉じた場所で聞こえてくる音をデザインする方法です。

https://twitter.com/sleepyslowsheep/status/1438049857432813570?s=20

ADX2の空間音響接続機能「3Dトランシーバー」を使用します。

後編はこちら: **ADX2+UE4で、屋内の音響をデザインする（後編）**
https://qiita.com/SigRem/items/bd2b62dedd111e3f5e15

当記事では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でサウンドを用意する

### マテリアルの用意
空間で聞こえてくる想定の音源を準備します。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c2180c01-31fc-ecf2-e55b-39b6cd61de56.png)
今回は水や風の音、断続的に鳴るチャイムや時計の音などを用意しました。ループ素材があると使いやすいと思います。
マテリアルを選択し、インスペクターにてループさせたい素材はループ情報の上書きが「True」、ループタイプが「ループ」になっていることを確認します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/442a6431-ee19-2ecd-b502-f816ce23ce47.png)


### キューの作成
マテリアルそれぞれに対してキューを作成します。
キューシートを右クリックし、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択します。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/29846d2d-6c1f-4169-8572-f2c90f123bd4.png)
作成したひとつのキューに対して、マテリアルをドラッグアンドドロップして配置します。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f1696a54-0b1e-5f92-e028-1fa6b6b4ab99.png)
必要な数だけキューを用意します。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5eaa69a7-0a6e-8b2a-6534-f9d4d56b2ffc.png)

### 3Dサウンドの設定

キューが空間上で鳴らされた際に、立体的に聞こえるよう設定します。

キューをひとつ選択し、インスペクターにてパンのタイプを「3Dポジショニング」にします。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/dd22ae4a-8361-5803-4019-284f91cc037b.png)
キューが3Dサウンドになったことを確認するには、セッションウィンドウを使います。
ツールバーの「表示」から「セッションウィンドウ」を選択します。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7202bce2-d174-35af-1da5-7e197145b9ec.png)
セッションウィンドウが開きます。下部にテストしたいキューをドラッグアンドドロップして登録します。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/db5d748b-9a93-9335-67a5-d739841bf587.png)
右上の「3Dポジショニング」ボタンをクリックすると、空間上の位置を指定できる緑色の領域が出現します。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/60add5f0-03d6-b575-dcb8-bee5bfcaad59.png)
「プレーヤーに3Dオブジェクトをアタッチ」にチェックを入れ、緑色の部分でドラッグして音の変化を確かめます。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/738a127e-dcc3-ed3a-b8c2-f6c4eb74d176.png)
左右に動かすとその方向から音が聞こえ、遠くに持っていくと音が小さくなるはずです。

### キューシートのビルド
キューの設定ができたらキューシートをビルドします。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/48fd1e05-7f55-1090-5b63-b2091b002bb0.png)
![A12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b55a343f-d160-6c2b-f9a2-3010bf985076.png)


## UE4でサウンドをセットアップ

### キューシートのインポート
AtomCraftでビルドしたキューシートをUE4にインポートします。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f1de36a9-85b2-e13f-2c41-ace7f3389157.png)
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/47ec4dcb-5116-d04e-5b0c-c516e1a49cc5.png)
acfファイル、acbファイル共にコンテンツブラウザの適当な場所へドラッグアンドドロップします。
ツールバーの「Edit」→「Project Settings」を開き、
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/de364416-c4e8-1c47-63a3-46c6c7ed88c7.png)
「CriWare」タブにて「Atom Config」にインポートしたacfファイルを指定します。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7c2de582-f4bb-f88d-37ea-7729ac536949.png)

### サウンドの配置・設定

今回はテスト用に、こんなレベルを用意してみました。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f64bb405-a55f-12ba-de2b-9fcfbf406d90.png)

スタート地点から狭い通路を通っていくと、T字路の左右でループするサウンドが鳴っています。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/67540a2d-3f6b-7b24-a55b-792220625e04.png)

通常はプレイヤーに聞こえるサウンドは次のようになるはず。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/49fd4fd1-9535-3883-7604-6387f931a346.png)


3Dトランシーバー機能を使って、次のように聞こえるように設定してみます。
![B08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/84b18823-bd6f-dd3b-555b-6b17c042435b.png)


まずは普通にAtom Cueを配置します。
![B09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d2dfac9d-3fb9-a17b-bc42-6f33623ba0c1.png)
ゲームをテスト再生して、音声が出力されていることを確認します。
![B10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2e440ace-7037-f90e-c3b7-a18de2b95075.png)
「@」キーで出せるコンソールコマンドから、「cri.ShowSoundLocation 1」を実行すると音源が可視化されて便利です。
![B11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0fc78b00-8488-60ab-d2aa-eb92f81a55ac.png)


さて、実際に3Dトランシーバーを使う……前にどんな機能なのか、詳しく見てみましょう。


## 空間音響接続、3Dトランシーバー
3Dトランシーバーを使う手順は簡単ですが、どういった動きをするのか理解してからでないと少々難しいかもしれません。

### 3Dトランシーバーについて
3Dトランシーバーの領域内にあり、リージョン（後述）が一致するサウンドはトランシーバー内に集積され、既定の座標から出力されることになります。
![B12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c89bd543-a0e2-3a34-3cf5-1925a78bd9e4.png)

トランシーバーから出力される音のパラメータは、トランシーバーが持つものに上書きされます。
つまり、音量や減衰、左右へのパンなどもトランシーバー固有のものに影響されるわけです。

さらに、Aisacコントロールまで変動させることもできます。プレイヤーとトランシーバーの状況により音のピッチや聞こえ方を変化させることも可能ですね。

トランシーバーが有効な領域にあるサウンドのうち、後述の「リージョン」が設定されているもののみ3Dトランシーバー機能に対応します。

### リージョン（Atom Region）について
リージョンは、サウンドと3Dトランシーバをマッチングするチャンネルのようなものです。
サウンドとトランシーバーに割り当てられているリージョンが同じ場合のみ、トランシーバーから音が出力されます。
![B13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/14d63b35-1ed8-7c2c-ebb7-1317ca42b3bb.png)


さらに、サウンドとリスナー（プレイヤー）のリージョンが同じ場合はトランシーバーから音が出力されず、普通にAtom Cueなどから音が聞こえるという性質も持ちます。
文章だけでは少し分かりづらいので、図にしてみましょう。
Regionとリスナーの関係
![B14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/78c4af38-d595-d863-dc0e-ea0212e433d3.png)


これらを踏まえて何度か触ってみると感覚が掴めるかと思います。
それでは3Dトランシーバー機能を使ってみましょう。

## AtomTransceiverBoxを使う
ADX2 for UE4には、単体で3Dトランシーバー機能を簡単に使うことができるアクター「AtomTransceiverBox」が用意されています。

### AtomTransceiverBoxを配置する

プラグイン内部にあるアセットはデフォルトでは表示されません。
「AtomTransceiverBox」はプラグインに含まれたアセットのため、手動で表示を有効にする必要があります。

まずコンテンツブラウザ下部の「View Options」をクリックし……
![B16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/19adbdda-6585-7ec1-ff7b-aed065a43614.png)
「Show Plugin Content」にチェックを入れます。
![B17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/95567f50-eca2-1d56-9698-4355faf0583d.png)
すると「CriWare Content」ディレクトリが出現し、「AtomTransceiverBox」アクターが表示されるようになります。
![B18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/695467ec-81d1-9746-02db-e23fa67f37ea.png)

コンテンツブラウザからAtomTransceiverBoxをレベル上にドラッグアンドドロップして配置します。
![B19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/963622ff-ef54-d412-5c1a-511e68ba5915.png)
Detailsパネルの「Box Extent」で領域の大きさが変えられます。さらに「Line Thickness」を上げることでボリュームを描画するラインが太くなり、視認性が増します。
![B20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4ed5414f-bc5f-12b2-f0b7-18807660bf78.png)

### AtomRegionの作成
3Dトランシーバー機能に使用するリージョンを作成します。
コンテンツブラウザの適当な場所で右クリックし、「Sounds」→「Atom 3d Region」を選択します。
![B21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b00747a7-f925-df03-0ae7-6a8e71ff9dad.png)
新規にアセットが作られるので、名前をつけておきます。
![B22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c86dc13f-35a6-12d1-8a37-99666f507748.png)
サウンド用、リスナー用にふたつ作っておきましょう。

### キュー、トランシーバーにRegionを割り当てる
トランシーバーの「Forward Region」に作成したリージョンのうちひとつを割り当てます。
![B23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/32ca7064-0c8f-7580-97a8-a038d532aa17.png)
AtomTransceiverBoxはふたつのトランシーバーを持っており、「Rear Region」も利用できますが今回はForwardのみ使用します。

Atom Cueにも**「Forward Region」と同じリージョン**を割り当てます。
![B24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7610243a-92ca-baf2-264b-62a7a088ef4e.png)

集積したいサウンドすべてに同じ設定を行います。
![B25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2aa1d697-56a1-cd21-986e-d75e62f71bd5.png)

テスト時に変化が分かりやすいように、クロスフェードの設定をしておきます。
AtomTransceiverBoxアクターを選択し、Detailsパネルの最上部にて「Atom3dTransceiverForward(Inherited)」を選択します。
これでコンポーネント単体のパラメータが編集できます。
![B29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d6823662-6152-21aa-0dc8-3e85ce84086a.png)
「InputCrossFade」のふたつの数値を小さくしておきます。
![B30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2cd6421b-c9a2-ea4d-9fbd-86538ef0323c.png)
この数値をある程度大きくしておけば、リージョンが切り替わっても聞こえ方が自然にブレンドされるようになります。


### BPからプレイヤーにリスナーを割り当てる
3Dトランシーバーを動作させるには、プレイヤー（リスナー）にリージョンを割り当てる必要があります。
ツールバーの「Blueprint」→「Open Level Blueprint」からレベルブループリントを開きます。
![B26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9b2593f2-6dbe-6477-0dc8-f1e735beb0e6.png)
**Input Key**ノードと**Set Listener Region**ノードを置き、「Region」には作成したリージョンを指定します。
これでキーボードの「1」「2」キーを押した際にふたつのリージョンが切り替わるようにします。
![B27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f460b825-553e-3c4c-b1db-5b95697c57f3.png)


### テストプレイ
キーボードの「1」と「2」キーを押して、プレイヤー（リスナー）のリージョンを切り替えてみましょう。
リスナーのリージョンがトランシーバーと一致しているときはそれぞれの方向から音が聞こえ、一致していないときには集積された音がトランシーバーの位置から聞こえるはずです。
![B28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a0882ef8-d73b-e840-fe5f-53b5b8bb1926.png)


### 補足

「Atom3dToransceiverForward」コンポーネントを選択すればトランシーバーの音の出力位置だけを動かしたり、
![B32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f1453a43-1491-08e2-b93d-4f031b505c70.png)
トランシーバーから出力される音にかかるボリュームやAisacコントロールの設定ができます。
![B31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6eef7a6a-016b-c247-3ff0-2363b22aba6f.png)