UE4+ADX2、ブループリントで作る立体的な環境音

# はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を連携させ、
環境音にひと工夫して、立体的なアンビエントサウンドづくりに挑戦してみます。

今回は森の中にいる鳥のさえずり音をべたっとループして流すのではなく、常にプレイヤーの周りで新しい音源が生成され続ける実装をします。
これにより、空間のあちこちに鳥が生息し気ままに鳴いている環境が再現できるはずです。
![B20C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a9fd26d2-0dfa-e33d-cebf-42b805fe97e0.png)
（かわいい鳥さんのイラストはイメージです）


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

# 前提
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/b22bb0bf-9f52-5869-df85-28cd0805dc3f.png)
用意した音声ファイルをAtomCraftのマテリアルツリーにインポートします。
今回は森の環境音のベースとなる「Forest_Wind」と、鳥の鳴き声を4バリエーション用意し「Forest_Bird（番号）」といった5種のファイルを用意しました。

### キューの作成
環境音、鳴き声のふたつのキューを作成します。
環境音として「Cue_ForestWind」を「ポリフォニック」タイプで、鳴き声として「Cue_ForestBird」を**「ランダム」タイプ**で作成しました。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/34db0c7b-b4bf-b4de-0aa0-2ff643204650.png)
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c9504e35-06fc-a2df-fb4c-7ad5e543eedb.png)
「ランダム」タイプのキューは毎回ランダムなトラックがひとつ選ばれて再生されます。

それぞれのキューに用意したマテリアルをD&Dして配置します。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/be0744f2-ca1b-66fe-316b-861afd2f0b81.png)
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6b8155be-d255-f0f4-4e75-64e57ae83661.png)
テスト再生すると、そのたびにランダムなトラックが再生されているはずです。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4b3aede1-3d3e-898b-aa05-088c9ebe2d51.png)

### 3Dサウンドの設定、確認
キュー内のウェーブフォームを選択し、インスペクターにて「パンのタイプ」を「3Dポジショニング」にします。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/88e30353-a430-94fc-137c-431a27b1da1d.png)
これにより、空間内で音が再生された際にスピーカーやイヤホンの左右で音が振られるようになります。
3Dポジショニングにしたサウンドを確認するには、セッションウィンドウを使用します。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1bd74d9a-d0e7-cfc0-24c6-af6c4f350c88.png)
開いたセッションウィンドウの「3Dポジショニング」をクリックします。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0635a5a5-0671-5af0-0e3d-f01038661acb.png)
下部のキューリストに「Cue_ForestBird」をD&Dして登録します。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/db603efd-4210-a2a5-0a46-9512b3e98c89.png)
「プレーヤーに3Dオブジェクトをアタッチ」をクリックすると、3Dポジショニングのテストを行う準備ができます。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/41d9e582-a826-f969-e6f3-c81dbe65b37e.png)
緑色の領域で聞き手と音源の位置を変え、音声のパンのかかり具合を試すことができます。
![A12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b1d8db9f-01d3-5502-b408-51f5e83e74af.png)

### キューシートのビルド
調整ができたら、キューシートをビルドします。
![A13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6b35e135-107a-5f67-d9b2-db7e1e924fa9.png)
![A14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f100ac3b-5f6f-55fb-ad8b-d74ce1cb48f3.png)


## UE4で立体的な環境音を再生する

### キューシートのインポート
UE4エディタを起動し、エクスポートしたacf、acbファイルをコンテンツブラウザにD&Dしインポートします。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4e083aa6-e14d-e402-8ffc-77573a4a1584.png)
プロジェクト設定を開き、「CriWare」タブの「Atom Config」ファイルにインポートしたacfファイルを指定します。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/dac6c88f-4cbc-86df-4ee3-9bff9116ba7d.png)
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/96aca2ee-36d5-a05a-0aa9-d524de1e7490.png)

### シーンのセットアップ
森の環境音を使うので、今回は森のシーンとなるレベルを用意しました。デフォルトのレベルでも動作は可能なので、気分次第でセットしてみてください。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c7cde3d0-9f0d-7fd5-8257-b387dfd66a81.png)
使用アセット：**「Nature Package」**
 https://www.unrealengine.com/marketplace/ja/product/nature-package
レベルを再生すると、風の音に加えて鳥の声が周りから絶えず聞こえてくるようにします。
![B05B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9ac4d421-dee4-0fd2-06c7-a036d1f1151c.png)
（繰り返しますがかわいい鳥さんのイラストはイメージです！）

「Cue_ForestWind」をレベルにD&Dして配置すると、そのまま再生されるようになります。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/61f8f09c-f9c2-88c9-3ca0-f1466e7075a6.png)

### ブループリントで鳥の声を再生する
レベルブループリントを開きます。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/dd22d634-bff3-015d-fe55-4434adfc4ebc.png)
空欄で右クリックし、「Add Custom Event」から新しいカスタムイベントを作成します。
![B08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ad87712c-1cb9-15c5-9f06-7e356d6370f3.png)
鳥が鳴くためのイベントなので「BirdCall」と名前をつけました。
![B09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fd6e872e-a723-c047-b2b0-0e3f070aa028.png)
イベント**BirdCall**から線を伸ばし、**Play sound at Location**ノードを配置します。同名のノードがふたつありますが、**Atomカテゴリ**の方を選択します。
![B10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7241577c-fdc5-645d-eff2-cd6e417ed312.png)
![B11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b6b6e8ce-8701-0ae6-c9d5-83689dcb93b5.png)
プレイヤーキャラクターの位置を取得するノードを配置します。**Get Player Character**、**GetActorLocation**のふたつのノードを組み合わせるとプレイヤーの座標が取得できます。
![B12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a6cb1572-c207-090e-6a98-353609b0d6d4.png)

プレイヤーの座標の周りのランダムな位置に鳥の声を鳴らしたいので、決まった範囲内のランダムな座標を生成します。**Random Float in Range**、**Make Vector**ノードを組み合わせます。Z座標だけはプレイヤーの上方のみに限定しています。
![B14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/03003636-d917-4bb8-a3e7-4cdc9a7ac4cd.png)
プレイヤー座標とランダム生成した座標を+（**プラス**）ノードで足します。そのまま**Play Sound at Location**ノードの「Location」ピンにつなげます。
![B15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9e308e1d-72cb-daa3-e7b6-9821acb11c59.png)
このイベントを起動するために、**Event BeginPlay**から線を伸ばし**Set Timer by Function Name**を配置します。「Function Name」には起動したいイベント名である「BirdCall」を、「Time」は「1.0」、「Looping」にチェックをつけます。
![B16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6a02d4dd-1603-3a5f-b5ad-30bd4345a648.png)
これにより、1秒間隔でイベント「BirdCall」が呼び出されるようになります。

再生してみましょう。周りのランダムな位置から鳥の声が聞こえるはずです。3Dポジショニングの設定がされているため、移動すると鳥の声がフェードアウトしていくのがわかると思います。
![B17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/29f4ec78-8f37-1a54-c285-52e96a7a83c0.png)
鳥の声はプレイヤーの周りに都度生成され続けるため、離れた場所に行っても同じように聞こえます。
![B18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5d98ddb5-c77f-8160-d009-2409a150a894.png)
現状ではきっかり1秒間隔で鳥が鳴いていますが、自然ではそうはなりません。**Delay**ノードと**Random Float in Range**を組み合わせ、ランダムな間隔で鳥が鳴くようにするといいでしょう。

「BirdCall」のイベント内に**Delay**ノードを挿入し、**Random Float in Range**ノードで指定した秒数の間ランダム性をもたせます。

![B21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3eabac0f-0bab-9210-ab93-4a6ef32bfe66.png)
これでイベントが走るごとに、Delayノードによるランダムな「間」が発生することになります。