ADX2 for UE4で、アニメーションに紐付いたループサウンドを制御する

# はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を連携させ、**キャラクターが行動中にのみ再生され続けるサウンド**を再生します。

ロボットのようなキャラクターの駆動音は、移動中ずっと鳴っていてほしいものです。しかしアニメーション中にキューを散りばめるのも面倒だし、BPから制御するのもスマートではなく……といった場合に、**AtomPlayGate**をアニメーションに紐づけて使うと便利です。


当記事では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

## 基本的な実装

### アニメーションにAtomPlayGateを埋め込む

UE4のエディタ上でアニメーションを開き、タイムラインの「Notifies」トラックで右クリックし、「Add Notify State」→「AnimNotifyState_AtomPlayGate」を選択します。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d5dd1b23-6821-7126-70ff-3ae45822f674.png)
AtomPlayGateがタイムライン上に現れます。両端のひし形の場所をドラッグすることで再生範囲を調節できます。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b9073793-4e97-96d3-d81d-ff4a083d5f67.png)
アニメーション中ループさせたい場合は、アニメーション全体を覆うように引き伸ばします。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b71e2ea2-e380-4f81-08f8-bdd4eed76227.png)
Detailsパネルにて、再生したいサウンドを指定します。アニメーションを再生するとサウンドがループするようになります。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f44f1b5a-070b-94d8-99df-b7be1a0dcd6c.png)
キャラクターの特定の部位からサウンドを再生したい場合、「Bone」に追従させたいボーン名を指定し、「Follow」にチェックを入れます。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3fbc5c30-43e1-3285-79cf-682c28f096b2.png)


## AtomPlayGateの再生キューにAISACコントロールをかける

たとえば「キャラクターの速度に応じて駆動音の高さや音量を変えたい」といった場合には、AtomPlayGateで再生しているキューに対してAISACコントロールを使うことで音に変化を起こせます。
しかし、AtomPlayGateでの再生はその場で完結してしまうため、通常Atom CueやAtom Componentに対して行うような参照はできません。
（たとえば、BPから参照できるキューがないため次の画像のような処理は書けません）
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8dcbc1e4-1e61-4c6e-8607-2a591a3c878c.png)

こういった場合、**カテゴリに対してAISACコントロールを行ってしまう**ことで解決します。
**Set Aisac Control by Name**ノードではカテゴリと名前を指定して、該当するAISACコントロールすべてに影響を与えます。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8a7068b6-2bfb-f3a3-6673-76df5f0bea65.png)

### キューのカテゴリを指定する
この機能を使うためには、AtomCraftで対象のキューにカテゴリを指定してあげる必要があります。
プロジェクトツリーの「カテゴリ」を開き、カテゴリーグループを右クリックして「新規オブジェクト」→「カテゴリの作成」を選択します。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/280f36f8-462b-bf43-727d-ee85bc012542.png)
新しいカテゴリが作られるので、任意の名前をつけます。今回は「Category_PlayerAction」としました。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1ba080f8-186c-993b-b457-bec5c9e1322a.png)
AISACコントロールをかけたいキューを選択し、インスペクターにて「カテゴリ」をクリックします。
カテゴリの編集ウィンドウが表示されるので、振り分けたいカテゴリにチェックをつけます。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4dba9073-0a95-db4c-885b-bbd82d3b9685.png)
ちなみにカテゴリグループを複数作ることで、ひとつのキューに対して最大4つのカテゴリを割り振ることができます。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/47ad6d53-bcdf-e15c-df3d-7d27aa6c0ef5.png)

### BPからカテゴリを操作する
キューシートをビルドしUE4に持っていくと、ブループリントノードからカテゴリへのアクセスが可能になります。
**Set Aisac Control by Name**ノードでAISACコントロールを制御しましょう。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/01c20c6b-8d96-749b-5275-8f45f1824927.png)

### アニメーション内の任意のタイミングでAISACコントロールを変化させる

アニメーション内でAISACコントロールを制御する方法もあります。
アニメーションのタイムラインの「Notifies」トラックを追加します。
![B10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/67b83dcf-f049-d5bc-8dde-7129fe553a70.png)
追加したトラック内で右クリックし、「Add Notify」→「New Notify」でユーザー定義のAnimNotifyを追加します。
![B11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8136ea71-e52e-715c-2c23-e3e156f15451.png)
今回はふたつ追加し、「AisacControl_A」「AisacControl_B」と名前をつけました。
![B12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/41b85485-6423-dbb1-4859-7ab014b22817.png)
アニメーションブループリントに移動し、イベントグラフでAnimNotifyに対応したイベントを追加します。
![B14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/98b35356-bef0-aca0-ea27-af0eaadbbe9a.png)
追加したイベントから、**Set Aisac Control by Name**ノードをつなげます。
![B13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a5b0ef4a-0969-e5e2-747c-cbc8eb1fd1ed.png)
これにより、ループアニメーション再生中はAISACコントロールの値が「0.0」から「1.0」の変化を繰り返すことになります。


カテゴリ全体を指定して音を変化させることで、移動速度だけでなく「キャラクターの強化状態に応じて攻撃時のサウンドが豪華になる」「ダメージを受けている場合はサウンドが劣化する」といった演出も可能になります。