ADX + UE5で、各種アクターにサウンドを付与して操作を行う

# はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5とサウンドミドルウェア「ADX for UE」を連携させ、「**各種アクターにサウンドを付随させ、各種操作を行う**」実装を行ってみます。

## 今回の実装例
UE5での開発では、ゲーム中様々なアクターを扱います。BPで作られたキャラクターやアクターもありますし、Niagaraなどを使用したエフェクトもその一部に当たります。
この記事では、アクターにサウンドをコンポーネントとして与え、親アクターの状態に即してサウンドに**後天的な変化**を与えていく処理を紹介します。


# 前提

UE5.4+「ADX LE UE SDK(2.03.00)」を使用します（他バージョンにおいても、基本的に実装方法は同じです）。
基本的にブループリントのみでの実装を想定しています。
ADXはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/

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

ADX for UEの導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
**ADX for UEの導入で、一歩上のサウンド表現を（導入編）**

https://qiita.com/SigRem/items/4250925f6d66a4fd287a

**ADX for UEの導入で、一歩上のサウンド表現を（実践編）**

https://qiita.com/SigRem/items/c089b71c42e898980a46


# 実装

## AtomCraftで環境音を構成する


## UEでサウンドを操作する

### アクターにサウンドを付与する

基本的な使用ケースとして、エフェクトのスポーン時にサウンドを付与してみましょう。
レベルブループリントを開きます。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b9b43344-8e01-a82f-5490-bcd6c1edab16.png)
**Get Player Character**～**Get Actor Location**でプレイヤー座標を取得し、その位置に**Spawn System at Location**でエフェクトをスポーンします。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/39c5d479-5635-757c-09f5-9eb0afc524bb.png)
この状態でテストします。「1」キーを押すごとに、プレイヤーからエフェクトがスポーンします。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d5bde4bb-a76b-cc13-4393-1102298caaf1.png)

ここにサウンドを付与してみましょう。
コンポーネントを追加するには、**Add Atom Component**ノードを使用します。
このノードの対象は「アクター」ですが、**Spawn System at Location**のアウトプットノードから参照できるのは「Niagara Particle System Component」です。
そこで、アウトプットノードから**Get Owner**ノードを使用し「Niagara Particle System Component」を内包するアクターを取得します。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/74dba16f-9835-fe25-2613-9e969ba8d975.png)
追加したAtomコンポーネントに、**Set Sound**ノードでキューシート及びキューを指定します。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/745bbf0b-d2cf-190d-19d2-605cbf05266f.png)
適当なキューを割り当ててみましょう。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/367bb882-0104-6c6d-08b1-d132dad1436d.png)
最後に、**Play**ノードでキューを再生します。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/001909f4-f7b6-7c97-2bc6-a71609e5e95c.png)


この状態でテストします。「1」キーを押すと、プレイヤーからスポーンするエフェクトと共にサウンドが付与、再生されます。
ですがコンソールコマンドでサウンドを視覚化してみたところ、サウンドの座標はワールド原点にスポーンしてしまっているようです。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/429a8afc-5959-56ba-22ce-02955bfc11f9.png)
「Niagara Particle System Component」のワールド座標を**Get World Location**で取得し、追加したAtomコンポーネントを**Set World Location**で移動させます。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0ba4cf55-52e8-1d9b-b095-cac847c6c82b.png)
これでエフェクトの位置にサウンドがくるようになりました。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ddb8d4e4-8d59-871a-07de-b0f7ef24ba73.png)



### 付与したサウンドを変化させる

付与したAtomコンポーネントを操作し、サウンドを変化させる例です。
**Add Atom Component**のアウトプットピンから線を伸ばし、ノードを追加します。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/61607797-f74c-1303-e571-c21f6baf047e.png)
**Set Aisac Control Value**ノードで、追加したキューにもAisacコントロールを行うことができます。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/47fbf878-5612-549b-3256-ef74c5de45eb.png)
キューの再生後にノードをつなげます。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ff0abdb6-3544-2b09-0b52-d9a873925abe.png)

これでサウンドの操作が可能なのですが、いちいち追加したコンポーネントから線をつなげる必要があり、場合によっては処理が煩雑になってしまいますね。
別の場所からコンポーネントにアクセスできるよう、変数として格納することでこの問題を解決できます。
**Add Atom Component**のアウトプットピンを右クリックし、「Promote to Variable」を選択します。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8c237d67-aa2d-dce7-c691-9d718681790e.png)
新たに変数が作られるので名前をつけ、自動的に作られる**Set**ノードをつなげます。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/03d32f28-31b6-300c-d690-d10518ee7769.png)
この変数を使用することで、別イベントや別アクターからでも追加されたキューにアクセスすることができます。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6196ef73-c21e-d16c-09be-16a9b849a108.png)
**Set Aisac Control Value**ノード以外にも、もちろん**Set Volume Multiplier**、**Set Pitch Multiplier**などのノードでも操作可能です。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3f6ba2c6-a2ff-32c1-0b1b-cfef624c2b80.png)


### 付与したサウンドを外部から取得する

では、さらに取り回しを良くするために、スポーンしたエフェクトを手がかりに、追加したAtomコンポーネントにアクセスしたいところです。
エフェクトのスポーン時、エフェクト自体を変数として格納しておきます。
手順はAtomコンポーネントの変数化と同じです。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fb7458a1-b287-a8c6-0bac-012174f8d64a.png)
しかし、変数化したエフェクトを他の場所で参照し、Atomコンポーネントを取得しようとしてもノードが出てきません。
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/34b23758-0263-1415-f657-317abaa46fe7.png)
これを解決するには、
1. エフェクトをGetする
1. エフェクトのOwner（アクター）を取得する
1. **Get Component by Class**ノードでAtomコンポーネントを取得する

という手順を踏む必要があります。**Get Component by Class**ノードでは取得したいクラスを指定する必要があるので、「Atom Component」を指定します。
![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e05631cc-2de2-7962-17d5-eb7de35b8a8f.png)
これで、同じようにキューを対象とした操作が行えるようになりました。
![C04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/841084d8-97fe-1127-c487-94c31909fad9.png)



### アクターの状態に応じてサウンドを再生、変化させる

アクターが特定の状態になった際、追加でサウンドを再生・変化させることも可能です。

アクターを対象とし、線を伸ばして「assign」と検索するとイベントディスパッチャを直接配置できる選択肢が表示されます。
例えば、ここで「Assign On Destroyed」を選択してみます。
![D01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fda0eea7-0958-c602-d563-720085752241.png)
選択すると、イベントを発火させるよう登録する**Bind Event**ノードと、その対象であるカスタムイベントが配置されます。
ここから各種ノードでサウンドを再生・変化できます。
![D02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e9abbcd2-a3b7-37e2-6112-4e7d26e36e5a.png)

また、**Bind Event**ノードだけを配置することもできます。
![D03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2c972b38-f4a5-24ee-d1cb-9f048cb4abea.png)
赤いインプットピンから線を伸ばして新規にカスタムイベントを配置したり、また既存のカスタムイベントと関連づけることもできます。
![D04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/006d25cd-1b76-feab-e5be-42acebf7b496.png)
![D05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/323772ac-7af9-560c-775e-62e9c3ff01e1.png)


これらの方法で、もともとAtomコンポーネントを持たない設計のアクターにもサウンドを付与し、自由に操作することが可能になります。
一度だけ使用する演出やちょい足しの処理としてとても便利です。