UE5 + ADXで扱うAISACコントロールを、UE5のカーブアセットで管理する(新バージョン対応版）

# はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5とサウンドミドルウェア「ADX for UE」を使いAisacコントロールを行う際のグラフを、UE5標準のカーブアセットに置き換えて管理します。
UE5の扱いに慣れている開発者がサウンドデザインをする場合にパラメータ調整をUE内で完結させられるほか、音声の変動量や係数などをロジックからリアルタイムに変化させられる利点などがあります。
AtomCraftを扱うサウンドデザイナーがいる場合はツール側に任せ、そうでない場合はこうしたエンジン側からのアプローチをとるのもいいかもしれません。


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

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

記事執筆時点のADX for UEのSDKバージョンは「ADX LE UE SDK(2.00.00.00)」です。

# 基本の使い方
ADX for UEの導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
キューシートやキューの作り方、UEへのインポート方法はこれらの記事にあります。
ADX for UEの導入で、一歩上のサウンド表現を（導入編）
https://qiita.com/SigRem/items/4250925f6d66a4fd287a
ADX for UEの導入で、一歩上のサウンド表現を（実践編）
https://qiita.com/SigRem/items/c089b71c42e898980a46


# Aisacコントロールとカーブアセット

## Aisacコントロールについて

AISACコントロールは、AtomCraft上でキューに対して設定することができるグラフで管理されます。
変動量を設定し、そのままAISACコントロールのスライダーを動かすことで音声のテストが可能です。

![C00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/15d616d9-9c4e-24af-8a0e-c9e315a1d964.png)

変動の対象となるのは音量やピッチの他、各種エフェクトなどにも値を渡してかかり方を操作することができます。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9afb13d5-9901-b6d1-5f3b-ec7eaf9ac580.png)


## UE5のカーブアセットについて

UE5でのカーブアセットも、同じように曲線グラフで形づくられるものです。
こちらはAISACコントロールとは違い、カーブグラフそのものがひとつのアセットとして扱われます。
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0ef06263-f510-7809-6c05-9c2cea049cdc.png)
ブループリントなどのロジックからアクセスも可能です。


# AtomCraftでのAISACコントロールの設定

0.0～1.0の変化量を同じにする

カーブアセットの使用を前提としたAISACコントロールの設定方法です。
まずは通常どおりにトラックリストの空欄で右クリックし、「新規オブジェクト」→「AISACのを作成」をします。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/733e95f5-1403-1b1e-4b77-94da70448039.png)
AISACの基本情報を編集します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3c91f129-0b29-9408-3f3a-fe22913ea1ff.png)
新しいグラフが開くので、「横と縦の0.0～1.0が同じ変動量になる」グラフを作成します。
右肩上がりの直線グラフになります。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f9fd4332-0818-6b70-8357-d84c301fc8a0.png)
コントロールポイントごとに、「ポイントリスト」ウィンドウで数値を設定すると楽です。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5960e801-345d-e410-b2c2-9dbf2303adfc.png)



# UE5でカーブをAisacコントロールの数値として使う

## カーブアセットの作成

UE5でのカーブアセットの作成方法です。
コンテンツブラウザ（コンテンツドロワー）の空欄で右クリックし、「Miscellaneous」→「Curve」を選択します。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3668e09b-1036-f4fe-4475-07cfea1da023.png)

カーブのクラスを選びます。今回AISACコントロールに対して必要な情報はFloat変数ひとつなので、「CurveFloat」をクリックします。
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/17d78e21-82eb-40db-5e1f-3872add35f65.png)

新しいカーブアセットが作られます。適当に名前をつけておきます。
![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/452edad8-9dc1-9115-3173-e48030d9bbdc.png)

カーブアセットを開くと、グラフの編集画面になります。
![C04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6cfe7bb2-2de7-34a5-b0ac-d94f498e0a18.png)

右クリックして「Add Key」かマウス中ボタンクリックでキーを追加できます。
![C05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1851d071-70c0-5c99-5ad5-254d26483b20.png)
![C06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/10afac1b-5865-fc3c-1442-9c89153d547b.png)

キーを選択して右クリックすると、カーブの補間タイプが選択できます。
![C07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/11351f84-1c04-c633-1fad-106f28e64d02.png)

適当にグラフを作ったら保存します。
![C08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f354b98c-df01-d528-5b63-1c116548a430.png)



## ブループリントでキューを再生する

ブループリントを使って、カーブアセットの数値をAISACコントロールに反映させる方法です。
簡単に実践してみましょう。

まずはレベルブループリントを開きます。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e7834baa-73a9-1c56-5127-8f5881cc9707.png)

再生するキューシートの指定のため、変数を追加します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c5b5189e-cca4-fb96-28af-51ccb281d46e.png)
型はキューシートから手動でキューを指定したい場合は「Atom Cue Sheet」を、直接キューを指定する場合は「Atom Sound Cue」です。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/98d1d330-30e6-d728-97de-c5b35140161e.png)
![D01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/94081e80-ff25-02c6-1fa7-d34ea403972b.png)

コンパイルしたら「Default Value」で再生するキューシート、もしくはキューを指定しておきましょう。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6883ef95-8cd8-36be-cadc-d3f5160943cd.png)
「1」キーを押したら**Spawn Sound at Location**でキューをスポーンし、再生します。
座標はどこでもいいですが、**Get Player Character**、**Get Actor Location**を使ってプレイヤーキャラクターの位置にスポーンさせれば確実に聞こえるでしょう。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3d4a2ef8-d98f-5b29-5166-6c4860904d18.png)
**Spawn Sound at Location**ノードは、「Atom」カテゴリ内のノードを使用します（重要）。
標準機能として搭載されている、他の似たノードと間違わないようにしましょう。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/38686480-58a1-a40e-1a1a-a8d9597df402.png)
**Get Sound Cue by Name**、もしくは**Get （AtomSoundCue変数）**などで再生するキューを指定し、再生処理が完成します。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/39d090ca-8eb6-6444-b3ca-20a7c6a23eed.png)

![D02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/eb7ad353-2a55-564d-ea4a-355fdac683c4.png)


キーボードの「1」キーを押すごとに、キャラクター座標にサウンドがスポーンするようになりました。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9f3c8aa7-fc37-4e59-a301-5a2a5064f135.png)

## ブループリントでカーブからAISACコントロールに値を渡す

Atomキューの再生ノードの青いアウトプットピンを右クリックして、「Promote to Variable」でキューを変数として登録します。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/38e16b8b-abfb-b317-1a2f-de43bb6e63b2.png)
変数に名前をつけます。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1297fbfe-3bfe-3f9d-e7bf-3840f5e05acd.png)

新しく変数を作成します。「Variable Type」を**「Curve Float」の「Object Reference」**に変更します。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8ed8139c-35e1-7f63-86c0-24ba5797de92.png)


「Curve Asset」の初期値を先ほど作成したカーブアセットにします。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/45f4c6f0-0791-ab8d-4655-45623f711a90.png)



カーブアセットの**Get**ノードから線を伸ばして、**Get Float Value**ノードでカーブアセットの数値が取得できるようになります。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/362996cd-6f35-4ee1-c8b6-9d3193e323d7.png)


別のキーを押すと、カーブアセットの数値を取得して、そのまま**Set Aisac by Name**でAISACコントロールに反映させる処理です。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3ae40a76-181b-8e8c-9791-dbfdf7018116.png)

これだけではノードが足りないので追加していきます。
**Set Aisac Control Value**ノードの「Aisac Control」を指定しなければならないので、ピンを右クリックして「Promote to Variable」を選択します。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8a4de2a6-4898-c558-cf65-1af3a3fa3cfe.png)
「Aisac Control」型の変数が作られます。コンパイルして、任意のAisac Controlを指定します。
この場合はボリュームを担っている「AisacControl_00」を指定しました。
![B08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1ea0aae2-f746-5494-96c5-800a50bcef17.png)
カーブの横の値を指定するため、こちらも「Promote to Variable」で変数化します。
![B09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ce78f866-f95b-6d90-c273-2ddf35f93a9f.png)
「Current Value」を代入し、それに応じたAisacControlの値が**Get Float Value**から取得できるようになりました。
![B10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/86c6905f-95d1-7eb7-da86-b025df2b564b.png)





例として、ボタンを押すごとに変数「Current Value」の値をランダムに変動させ、AISACコントロールを操作するグラフです。
![B11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/610eb6a1-e4ed-a1b0-f587-b38d087c2b8b.png)


**Set**ノードで「Curve Float」型の変数に異なるカーブアセットを代入可能なので、時間あたりの変動量なども異なるカーブに差し替えることができます。
![B12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/205238b7-b3a3-ccba-2dcb-7cc4f3bd0e18.png)


# 補足

カーブドリブンの実装を紹介してきましたが、もちろんAtomCraftでグラフを作ることのメリットも多々あります。キューを直接編集して新しいパラメータを設定したり、セッションウィンドウを使ったイテレーションなどの恩恵はUE4で完結できません。
UEを触らないアーティストの方にサウンドデザインを任せるならAtomCraftで、逆にエンジニアが主導でサウンドデザインを行う場合はUE4のカーブ機能を採用するなど、プロジェクトごとに比重を変えていくのがベストでしょう。