UE4+ADXで、BPによるエディタ拡張を使った小ネタTips（サウンドの埋まり防止、アセット参照など）

# はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX for UE4」を連携させ、「Editor Utility Widget」機能（以下EUW）を使ってエディタに便利な機能を追加します。

以前のEUWに関する記事はこちら。

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

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

https://qiita.com/SigRem/private/81ae1a4ac12c3bd66052


これらの記事に機能を追加する形となりますが、この記事で紹介する機能だけでも使用可能です。



# 前提

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


# 実装

## 浮いていたりオブジェクトに埋まってしまったサウンドを見やすい位置に整列する

レベルに配置したサウンドやアクターが、操作ミスであらぬ位置に置かれてしまった際に役立つ機能です。
ADXを使ったサウンド機能では「障害物を通した音を聞こえにくくする」ものがあり、有効になっている状態で座標がずれると本来期待した聞こえ方にならない場合があります。
特定のクラスのアクターのみを地形に合わせて配置しなおし、そういった現象を防ぐことができるでしょう。

まずはEUWにUIとなるボタンを追加します。テキストはなくても大丈夫です。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/11f159e5-a9e4-6a1c-d54f-c77997c4923d.png)
ボタンを選択し、Detailsパネルの下の方にある「On Released」を押し、ボタンが押して離された際のイベントを追加します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/baf1ea7f-7b09-ce22-3197-dad08f62b819.png)
イベントから処理を書いていきます。まずは目標のクラスを指定し、**Get All Actors Of Class**ノードで全アクターを取得します。
取得したアクターすべてに処理を適用したいので、**For Each Loop**でループをかけます。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b408d432-704f-2dbf-afae-3268528e9bb4.png)
再配置処理の内容としては
**「アクターのZ座標+5000」（上方）から「アクターのZ座標-5000」（下方）までをトレースし、衝突した座標へと移動させる**ことで実現できます。
トレースは**LineTraceByChannel**ノードを使います。「Trace Channel」は基本的な当たり判定となる「Visiblity」としますが、プロジェクトによってふさわしいものがあればそちらを優先してください。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d1224631-12ec-b910-14f0-2099a76e8266.png)
**LineTraceByChannel**ノードの赤いアウトプットピンではトレースがヒットしたかの判定が返されます。
Trueであれば**SetActorLocation**でヒット位置までアクターを移動させましょう。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f299b25f-dfff-818d-99bd-c9a2a5bdf0f2.png)
グラフの全体図としてはこんな感じです。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7808254c-21fd-6a7c-e547-b71ec3782b91.png)
テストしてみましょう。ボタンを押す前は浮いていたり地面やオブジェクトに埋まってしまっているアクターたちですが……
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2be41628-d1f4-9121-0c65-b8cc67e7d270.png)
ボタンを1度押すだけで座標が地上へとぴったり変更されました。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b37bc702-f533-e2a2-4ab1-9aa91884318f.png)

アクターが半分埋まっているのが気になる、という場合は少しだけ数値を足してあげるといいでしょう。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9d890f56-df82-9157-4296-7427fff9ee03.png)
これでアクターが少し浮いた状態で配置されます。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1f742ba5-aba9-d938-8dfc-dd6334205b4d.png)


## 選択中のアクターで使用されているサウンドアセットを開く

アクターが「Atom」コンポーネントを持っている場合、再生するアセットを開きます。
アセットの設定を変えたい場合などに役立つでしょう。

まずはボタンを追加します。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6246e7ac-8264-0d1a-b5d5-74655e8c7e44.png)
ボタンを選択した状態でDetailsパネルの下のほうにある「On Released」を押してイベントを追加します。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3efe3e35-31c7-b3e7-f95b-d0fdc75515dd.png)
処理は単純なもので、次のような感じになります。EUWでは**Open Asset**ノードを使ってアセットを直接開くことができます。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/479b1190-bf70-1584-26c8-7b20579eb651.png)
ボタンを押すと、アクターがAtomコンポーネントを持っている場合はアセットが呼び出されます。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a47a4993-67a6-5b2e-187c-3158de2bb9ec.png)


## アセットのループ設定を変更する

選択しているアクターが参照しているサウンドのループ設定を変更します。
環境音なのにワンショットで再生が止まってしまう、ループしてほしくないのに再生され続けるなどの問題を発見した場合にすぐ直せるようになります。

EUWにボタンを「ComboBox」を追加します。コンボボックスはプルダウンメニューとして使用できるパーツです。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/537e41a4-efce-536a-b2ef-e99c2b62fcc0.png)
コンボボックスのオプション（選択肢）を追加します。
必要なものは「Inherited」（AtomCraftでの設定を使用する）「Loop」「OneShot」の3つです。
デフォルトでは文字の大きさが少し大きすぎるので、「Font」の項で小さくしておきましょう。
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/74f9bad9-db77-a209-71ff-4ce86800b00f.png)
下の方にある「On Selection Changed」を押して値が変更された際のイベントを追加します。
![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e0ecf481-faaf-a4b8-5510-6fc47627ebc5.png)
グラフはこんな感じです。値に応じて**Switch on String**で分岐させ、**Set Loop Setting**ノードでループ設定を上書きします。
![C04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/cc27c26c-c3b8-d63d-9bc8-0eaf827b69f4.png)
EUWのプルダウンメニューと同期して、アセットの設定が変わるようになりました！
![C05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/73f0537e-9480-7bab-1e8b-ee6b9e4ab115.png)

EUWでは必要に応じていくらでも機能を付け足していくことができます。
BPだけで完結できるエディタ拡張なので、気軽にいじってみてはいかがでしょうか。