ADX2 for UE4で、BPやcsvを使ってサウンドを管理する方法

# はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を連携させてサウンドを扱う場合、キューには様々な管理方法があります。
オーソドックスに使う場合、サウンドオーサリングツール「AtomCraft」上でキューシート、キューをビルドしてしまいUE4に取り込む方法がメジャーです。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ceafe11d-c29f-50c8-bb74-354304b5a23c.png)
しかし、キューシートのアセットさえあればブループリント上からキューを取得したり、またcsvを使ってサウンドの名前やパラメータの管理をすることもできます。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/afd93a30-6993-8853-6d6b-ca72ce1f7fc3.png)
コンテンツブラウザ内のアセットも最小構成になります。
これにより、ADX2やAtomCraftを使わないアーティストの方との連携もやりやすくなるでしょう。


当記事ではUE4.26.1を使用します。基本的にブループリントのみでの実装を想定しています。
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


# 実装

## キューシートを用意する

今回はサンプル用に、BGMやSE、UI用のサウンドキューが入ったキューシートをAtomCraftで用意しました。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f323b02c-f83c-cd81-2d82-90b444626f29.png)
普段どおりビルドします。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/31a96613-77d6-b24b-34b9-b45815049db8.png)

UE4へはキューシートとAtomConfigファイルのみをインポートします。
キューシートのインポート時に「New Assets」の場所で「Do Not Create」を選択すると、キューがインポートされなくなります。
下部のキューリストのチェックを外しても同様です。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1f16ffd4-0a6b-6286-9165-97f2ac29f8ae.png)
最小構成のファイルがインポートされました。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0c1ab250-4772-0f6b-bc42-9c1f8f1813cc.png)


## BPからキューシートを読み込み、キューを取得する

### 変数を用意する

レベルブループリントを開き、キューシートを取得する変数を用意します。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/35a6cee8-3443-7110-27ca-d2bb90995444.png)
「My Blueprint」にて、変数を追加します。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f22c1334-6949-3e36-af93-3c7ffb09e346.png)
「Variable Type」を「Sound Atom Cue Sheet」の「Object Reference」にします。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/55600a7e-be33-07ae-a505-0b86d2f3513d.png)
名前をつけ、BPをコンパイルしてから「Default Value」を今回使用するキューシートにします。
変数名は「CurrentCueSheet」にしました。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5e60dbac-e55c-de09-de50-e04540e4f474.png)


### 変数からキューを取得する

作成した変数の**Get**ノードを配置します。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/cccda00a-1d5d-f75a-6b23-c91189f71624.png)
**Get**ノードから**Get Atom Cue by Name**ノードが引き出せます。このノードで名前を指定してキューを取得できます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/55869ecf-e4f1-daac-951a-699ed9030763.png)
取得したキューを参照し、再生・制御が可能です。
次のノード配置例では、キーボードの「1」キーで効果音が再生されます。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3b1a5ca7-c2ec-4f8b-49ea-87db7c956bb8.png)


## csv（データテーブル）からキューシートを管理する
Excelなどの表を使ってキューを取得・管理することもできます。UEに「データテーブル」として取り込んで使用します。

### データテーブル用のStructureを用意する
データテーブルが持つ要素を登録するには、「Structure」（構造体）アセットを作成する必要があります。
コンテンツブラウザで右クリックし、「Blueprints」→「Structure」を選択します。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/979c2bdc-b008-6785-3657-6e22bc83a59f.png)
適当に名前をつけます。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/979d0bd3-d45a-0aa6-e1a9-c7afea6cec25.png)

Structureを開き、「New Variable」ボタンを押して要素を追加していきます。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d4ae6a11-a3a2-5c01-07b9-4fd2766d363b.png)
今回はシンプルに、「キューのインデックス」「キュー名」「ループタイプ」「UI用サウンドか否か」を情報として持たせています。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/30608a7c-18ac-c9bd-78f0-82ea0a0d6fce.png)

### データテーブルを作成する
コンテンツブラウザで右クリックし、「Miscellaneous」→「Data Table」を選択します。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ece9fa46-f5f5-3915-977e-b2baa4981057.png)
先ほど作成したStructureを選択します。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/97a8052a-ef11-f0f4-3895-f2b1976d3ec7.png)
「Add」ボタンを押してインデックスを追加していき、それぞれ情報を入力します。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a275226b-0572-e068-0568-fffb8dc54a2c.png)
「bUISound」では、距離の関係ない（3D空間上で扱わない）BGMとUI音でTrueにしています。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ea0d9763-8090-3047-5a7f-e17c1a00a438.png)


### BPからデータテーブル情報を取得し、再生する
レベルブループリントでデータテーブルを扱っていきます。
**Get Data Table Row （データテーブル名）**ノードで名前を取得してデータテーブル情報を得ることができます。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/21b81598-981b-30eb-a7d5-055bb4bef210.png)
「Out Row」ピンから**Break**ノードをつなげることで、取得した行の要素を分解して取り出せます。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/60c71cf6-bb03-8e72-075a-9bf21984d278.png)
取り出した要素から「Cue Name」ピンを**Get Atom Cue by Name**につなげます。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c9c2b02e-495c-e9de-7bff-cce6e58d3da0.png)
「Loop Type」でループ情報が指定できるよう、キューに対して**Set Loop Setting**ノードをつなげます。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/dcd9c42b-8d8e-a913-08d6-ea92a23cfd6d.png)
「bUISound」が「True」であれば**Spawn Sound 2D**で、「False」であれば**Spawn Sound at Location**で座標を指定して再生します。
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8994a350-9668-20ea-c21e-df48918d05c7.png)


もちろん、**Get Data Table Row**ノードの「Row Name」は変数で指定可能です。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2829f200-38f7-6ea4-1e01-2b03a6a145d0.png)
キューは名前での指定ではなく、**Get Atom Cue by Index**を使ってインデックス情報でも指定可能です。
![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ebbba355-5b79-558c-04f2-841b6d240fac.png)


### スプレッドシートでデータテーブルを記述し、インポートする
同じ書式のシートをGoogleスプレッドシートで書くこともできます。
![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d0c9e666-9726-ec22-77ae-7c3cb18a0bdb.png)
「ファイル」→「ダウンロード」→「カンマ区切りの値（.csv、現在のシート）」でスプレッドシートを出力します。
![28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2fa2e4dc-19a7-f353-db19-a425688c6bb7.png)
コンテンツブラウザにドラッグアンドドロップすると、インポートダイアログが表示されます。
キューシートに適したStructureを指定して「Apply」を押します。
![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7c2a5d1b-048d-2531-38a0-fbe57c34acb9.png)
同じような形式でデータテーブルを取り込むことができます。
![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7fd40d06-d9a1-f50a-b83c-257d178c4b22.png)
「Reimport」ボタンを使用して、スムーズなイテレーションも可能です。