ADX for UE4で、キューシートからキューを動的に読み出す

# はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX for UE4」を連携させる際、キューそのものを**扱わず**キューシートから直接読み出す方法についてです。

## キューシートから動的に読み出すメリット

キューを動的に読み出すことで次のようなメリットがあります。
- キュー名ベースで管理するため、外部のスプレッドシートなどでデータの把握がしやすい
- キューシートのインポート時にキューアセットを作成しないことで、パッケージのビルド時間短縮につながる
- アセットのリファレンス関係をクリーンに保てる

しかし、キューアセットがレベル上のアクターパラメータから直接参照できないなどのデメリットもあります。
この記事では実装を一工夫し、そういったデメリットを無視する手段も紹介します。

# 前提

当記事ではUE4.26.1を使用します。ADX LEがUE5に対応した際は同じ実装法が使えると思われます。
基本的にブループリントのみでの実装を想定しています。
ADXはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/

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

記事執筆時点のADX 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でビルドしたキューシートをUEにインポートします。
acb、acfファイルをコンテンツブラウザにドラッグアンドドロップしてください。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/78d593c0-17a2-161b-2348-1c8a3ce9014f.png)

キューアセットを生成しないよう設定するには、インポートオプションを操作する必要があります。
「SoundAtomCue Assets:」の「NewAssets」を「**Do Not Create**」に変更します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4c95b263-6baf-1ba0-d175-29901d491d9f.png)
ウィンドウ下部の「Apply same settings for other imports.」にチェックをつけると、この設定をデフォルトとしてインポートするようになります。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2e81b471-44ad-fcca-963d-b6524c56270f.png)
また、「Existing Assets」を「Delete」にすると既存のキューアセットが削除されます。
これは取り返しがつかないため、既に参照されているアセットがある場合は「Keep」にしておくのが安全でしょう。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8515615f-a79b-fe49-63d9-43b51198b935.png)

これでキューシートとAtomConfigのみがインポートされました。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4ebaae42-89d7-ae89-a277-1139d1687652.png)


ツールバーの「Edit」→「Project Settings」からプロジェクト設定を開き、
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e3707d74-8c40-4fe9-e130-2aab45a74160.png)

CriWareタブの「Atom Config」にインポートしたacfファイルを設定します。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e0676024-1680-f411-2070-54b79d10b1bc.png)


### キューシートからキューアセットを直接読み込む

キューシートのみをインポートしたことで、アセットとしてキューを参照することができなくなりました。
ブループリントからキューを抽出して再生してみましょう。
ブループリントエディタを開き、キューシートを格納するための変数を追加します。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/47bee312-4898-61d9-3ec2-80745ef5222e.png)
Detailsパネルにて変数名と型の設定をします。「Sound Atom Cue Sheet」型の「Object Reference」を選択します。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b3975534-2a04-9d6c-eb24-0e477ac8bee6.png)
**コンパイルし**、変数の初期値としてインポートしたキューシートを指定します。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/045d5761-55ab-4fc8-af69-ef4f9aa0ed84.png)
**Play Atom Sound at Location by Name**ノードでキューの名前を直接指定して再生が可能です。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/71eae438-08d8-20fd-076c-aef3837a9096.png)
このノードは再生するためのパラメータが必要になるため、青い「Params」のインプットピンから線を伸ばし**Make AtomComponentParams**ノードを配置します。
![B05b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/dafc97b8-3289-a2f3-3974-d768827e5a46.png)
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5169fe8c-768f-e6e8-b9bf-b2d3d218632c.png)
これでRキーを押すと、キューアセットがないにも関わらず該当するキューが再生されるはずです。



### アクターパラメータからキューを参照する

この方法ですと、レベルに配置したAtomコンポーネントに直接キューアセットを指定することができません。
しかし、キュー名を変数として保持すれば通常と変わらない挙動で扱うことができます。
ブループリントを使い、レベル上のAtomコンポーネントに任意のサウンドを再生させてみましょう。

適当な場所にブループリントクラスを作成します。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5e073758-2135-4c2e-d9ed-0954ba996797.png)
親クラスは「Actor」としますが、他に望む処理がある場合は別のクラスにしても構いません。
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d68c58c0-d67c-f859-5ca2-e47f2a03ffa0.png)
適当に名前をつけます。
![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/99638be4-b41c-d5e5-7e1a-72d684e192d5.png)
ブループリントを開き、「Atom Component」を追加します。サウンドを再生する役のコンポーネントです。
![C04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/16594f7d-70e5-b523-267c-4660edf3b55b.png)
ふたつの変数を追加します。それぞれ「Sound Atom Cue Sheet」型と「Strings」型です。
![C05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/bbb9113d-291e-a5d9-8cb0-7dcf8ab58b64.png)
どちらも目玉のマークをクリックして、変数を外部からアクセス可能にしておきます。
![C06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/bb379cce-f9ee-a53a-0cdb-c73b09ce5d78.png)
イベントグラフで処理を書いていきます。
**Get Atom Cue by Name**でStrings型の変数の名前を読み取り、キューを取得します。
![C07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/68d4241d-0bd5-691c-fdfc-02152e776b24.png)
Atomコンポーネントに対して、**Set Sound**で取得したキューを再生するサウンドに指定します。
![C08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/afaae051-9ed8-cc37-52f0-22de51a60976.png)
最後に**Play**ノードでAtomコンポーネントを再生します。
![C09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/533acab0-b1fc-798c-d985-65ba3088ba8e.png)

これでキューシート、キュー名を指定してサウンドが再生されるようになりました。
![C10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d67fcc87-aef2-a18f-e1a9-837385eb8ee4.png)

キューアセットを作成しなくても再生が可能で、コンテンツブラウザの視認性も上がります。
どうしても必要、という場合でなければこういった方法でプロジェクトのシェイプアップをはかってもいいかもしれません。