UE4+ADXで、特定の音をトリガーとするAISACコントロールを行う

# はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX for UE4」を使いて、特定の効果音が再生されるのをトリガーとして、他の効果音のAISACコントロールを行う方法です。

たとえば「大きな爆発音が再生されると、プレイヤーの聴覚が一時的に異常をきたし他の音がくぐもる」「焚き火に燃料を投げ入れると、一瞬だけ火の音に勢いがつく」などの演出が想定できます。

この機能はAISACモジュレーショントリガー（AISAC Mod Trigger）と呼ばれるもので、キュー再生時・停止時に影響される側のキューのAISACコントロールを操作することができます。
AtomCraftで設定してしまえばADX側で自動的に行われる処理で、プログラム側で特別な処理を組む必要がありません。



# 前提

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

まずはAtomCraftでキューにREACT機能を設定していきます。
当機能ではUE側で行うことは少ないので、この工程が要となります。

### マテリアルの用意

効果音素材となるマテリアルを用意します。
サンプルのシチュエーションとして「**川の近くで爆発が起こり、一時的に川の音がくぐもり聞こえづらくなる**」というものを想定します。
今回は爆発音をふたつのSEで構成しているので、マテリアルを3つ用意しました。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4715a975-c40c-e6cc-74bc-f1bce2a7022e.png)
川の音はループするよう、マテリアルを選択してインスペクターでループ情報の上書きを「True」にしておきます。
![A01b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8c0b90a1-07fa-5f24-b15b-3204d906ac70.png)


### キューの作成

効果音からキューを作成します。
キューシートを選択し、右クリックして「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選びます。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/14c4115a-be88-43c0-4823-8e11dc5ce2dd.png)
必要なマテリアルをドラッグアンドドロップしキューを構成します。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0d8ab593-9404-ed64-05cd-3cb211dec1be.png)
川の音用のキューも同様に作成します。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ee2557ee-3127-3482-b371-4f344cb800f9.png)


### AISACコントロールを作成する

川の音に対しAISACを作成します。
トラックリストの空欄で右クリックし、「新規オブジェクト」→「AISACの作成」を選択します。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a6b4f365-81fb-2286-e271-eff56b852765.png)
AISACグラフタイプを「バンドパス - Cof高域」とし、パラメータに応じて音がくぐもるようにします。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ee29b97a-7ebd-f954-0708-a57678283f15.png)
グラフを任意の形に設定します。
注意点として、**グラフの始めと終わりでパラメータが同一となる**ようにしてください。ずれが生じると、AISACコントロール終了後もサウンドに変化が起こったままになってしまいます。
また、次の画像のようにコントロールタイプを「オートモジュレーション」、タイプを「ワンショット」、トリガタイプを「キー」とします。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f8be5e10-0ebe-c83c-9cc9-5834ae08d5d6.png)

サウンドがどのように変化するか確認したい場合、トリガタイプを一時的に「再生」としてみてください。
テスト再生することでサウンドに変化が起こります。
テスト後は忘れずにトリガタイプを「キー」に戻しておきます。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e2afbda4-a6bb-e05f-24db-7f5f9a8909fb.png)


### AISACモジュレーショントリガーを設定する

REACTの設定をしていきます。
まずは影響されるサウンドとトリガーとなるサウンドの分別のため、カテゴリを設定します。
プロジェクトツリーの**カテゴリグループ**を右クリックし、「新規オブジェクト」→「カテゴリの作成」を選択します。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e6200841-2aae-0040-fe37-8830c6924d1b.png)
カテゴリをふたつ作り、それぞれに名前をつけておきます。影響される側は「Category_SE_Rec」、トリガー側のカテゴリ名は「Category_SE_Trigger」としました。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/918e104a-ddfa-3d2f-7aeb-9e510a963fee.png)
今度はプロジェクトツリーのREACTを右クリックし、「新規オブジェクト」→「REACTの作成」を選びます。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5d5366aa-3cec-09ee-361e-0eafdc23b381.png)
作成したREACTに適当な名前をつけます。
![A12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e95daf53-24f1-68ba-c615-e18c23fcf452.png)
名前をつけたREACTを選択し、インスペクターでパラメータを設定します。
「変化カテゴリ」に影響されるカテゴリを、「トリガーカテゴリ」にトリガーとなるカテゴリを指定します。
REACTタイプを「AISAC Modトリガー」に変更します。
また、ここで任意のモジュレーションキーを設定することで複数のモジュレーショントリガーを扱うことが可能です。
![A13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b25adb1b-8a4b-6bee-c958-f4b4ae23f699.png)


### キューシートのビルド

ここまでできたらキューシートをビルドします。
![A14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/946cec78-b1be-6e29-8b1c-d4766be5f9a4.png)
![A15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5917c994-63a5-911e-8ce3-3ccdf74b979f.png)



## UEで効果音を再生しテストする

UEに移り、サウンドを再生してどう変化するか確かめてみましょう。

### キューシートのインポート

まずはビルドしたacfファイル、acbファイルをインポートします。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ae30f72b-e9e3-46a6-931f-5e59b3094cf1.png)
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9322d89a-4259-ea44-9c9f-a6c17b6c9f5f.png)
ツールバーの「Edit」→「Project Settings」からプロジェクト設定を開きます。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/34fafa8c-5d18-9e5b-4b36-6151045c20ae.png)
「CriWare」タブにて、Atom Configの項目にインポートしたacfファイルを指定します。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3b75c2d2-b8c5-e4a2-6c3d-835df58f5672.png)
ここまで設定できたら、**一度エディタを再起動**することをおすすめします。
そのまま進行すると正常にREACTによる変化が起こらない場合があります。



### 効果音を再生する

コンテンツブラウザからレベル上に川の音となるキューをドラッグアンドドロップして配置します。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/577e3622-a549-7f61-adb4-5e47aa87b44e.png)
レベルブループリントを開きます。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ff707e6e-614c-07c4-41ca-587e0d05386f.png)
テスト用の処理は簡単なものです。
**Input Key**でキーが押されたことを感知し、**Play Sound at Location**で爆発音のキューを再生します。
テスト用なので爆発音のボリュームをごくごく小さくとどめたほうが分かりやすいかもしれません。
また、**Play Sound at Location**ノードはADXにより追加された、Atomカテゴリにあるノードを使用してください（同名のノードがふたつあります）。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/003af258-0120-ff4b-203b-288ca998d4a4.png)

ゲームを再生しRキーを押すことで爆発音が鳴り、それをトリガーとして川の音がくぐもるような変化が起きるはずです。


## 補足

紹介した方法では対象となるサウンドすべてにAISACコントロールを設定する必要がありますが、「グローバルAISAC」機能を使えばすべてのキューから参照できるAISACコントロールを適用することができます。
**グローバルAISACの公式ヘルプ**
https://game.criware.jp/manual/adx2_tool/latest/criatom_tools_atomcraft_global_aisac.html