ADX+UEでサウンドの配置作業を効率化する（基本編2）

# はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX for UE4」を連携させ、サウンドの配置・調整作業などを効率化する記事の第2弾です。

前回（第1弾）の記事は以下にあります。
**ADX+UEでサウンドの配置作業を効率化する（基本編1）**
https://qiita.com/SigRem/private/efd9a7b9aef44f463d73

処理は通常のブループリントと同じ感覚で書くことが可能です。
これを使うことで、自分以外のデザイナーがコードやBPをいじらずとも、レベル上のサウンドをデザインすることができます。
また、編集できる項目を制限することで情報が整理しやすく、混乱を防ぎ編集ミスの防止にもつながります。

# 前提

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


# 実装

## アクターの情報を編集可能にする

まずはアクターのプロパティを外部からアクセス・編集可能にする必要があります。
前回の記事で作成したアクター「BP_CommonSound」を開きます。
新規に作成してもかまいません。AtomComponentが配置されているだけのシンプルなアクターです。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/938d8cd6-6f84-c5d8-957b-8453002becbe.png)
外部から編集できるように変数を作成します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/70bc47f3-0a08-c746-595d-8adeb3b4eb3b.png)
4つの変数を作ってみました。
- 「**Sound**」SoundAtomCue型です。再生するサウンドを指定します。
- 「**Volume**」Float型です。サウンドのボリュームを設定します。
- 「**Pitch**」Float型です。サウンドのピッチを設定します。
- 「**AutoActivate**」Bool型です。ゲームプレイ時、自動で再生開始するかを指定します。

（型を間違えないように注意しましょう）
![A02b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ef94a411-6bb6-55e9-a82c-4c99b4ad5d28.png)

4つすべての変数について、目玉のアイコンをクリックして公開（外部からのアクセス許可）しておきます。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b243956b-a65e-8bd1-47ec-55409f0d10a6.png)
Construction Scriptタブに移動します。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1e1f266d-eb8b-042d-688f-97d1694e8958.png)
もしタブがない場合、My Blueprintタブの「ConstructionScript」をダブルクリックすることでも開けます。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/163acb9d-df3e-64fe-6ecc-3d8a1fbd80dc.png)

ConstructionScriptはアクターのプロパティなどが書き換わった際、エディタ上で自動で実行される処理です。
ここで各変数の値をAtom Componentに書き込む処理を書いていきます。
**Get Atom Component**ノードから線を引き出し、**Set Sound**、**Set Volume**、**Set Pitch Multiplier**、**Set Auto Activate**ノードを配置します。
インプットピンには各変数の**Get**ノードをつなげます。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a30f03e4-aec9-daea-997a-fae13777a60d.png)
青い線が重なってしまいわかりづらい場合は次の画像も参考にしてみてください。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fdc3aeda-687a-a4d9-5b22-372d1bcd4ecd.png)
これで外部からアクターのサウンド情報をいじることができるようになりました。


## Editor Utility Widgetでアクターのプロパティを編集する

Editor Utility Widget（以下EUW）でアクターが持つ情報を取得・編集できるようにします。
新しくEUWを作成します。
コンテンツブラウザで右クリックし、「Editor Utilities」→「Editor Utility Widget」を選択。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8ad73be4-1891-a4c7-dbf5-29406b9e34f0.png)
適当に名前をつけます。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f1fbcaa7-8771-a860-a20b-f3a6e221f73a.png)
EUWでは通常のビューポートで使用できる「Details」パネルと同様の機能を配置することができます。
Paletteパネルにある「Details View」です。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5a947b27-2f63-564d-6497-fe52259f73fb.png)
配置すると「Undefined Object」と表示されますが、実行中に対象のオブジェクトを指定することで使用できるようになります。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/10442eab-2dda-6e3d-56ad-ae1a802215c5.png)
選択中のアクター名を表示するテキストを配置します。「IsVariable」にチェックをつけ、BPからアクセス可能にします。
![A12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f192d021-d08c-0f2e-5097-9a5b5aa9a9db.png)

グラフに移動します。
![A13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/357442cd-52ee-49c9-3e46-50e854da5d30.png)
Actor型の変数「SelectedActor」を作成します。エディタ上で選択中のアクターを格納しておくためのものです。
![A14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d76d7826-3357-a8e1-8166-7f095c22f491.png)
カスタムイベント「SelectedActorChanged」を作成しておきます。
![A15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/112220e0-3612-31ed-2769-ad80bfd6ed4c.png)
エディタ上で選択中のアクターが変わったタイミングで処理を走らせたいので、選択中のアクターが変わったかを判別する処理を組みます。
![A16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6f98e241-2008-d728-265a-6104ec557dce.png)
カスタムイベントを次のように組みます。
先ほど配置した「DetailsView」は**Set Object**で対象を指定できます。
![A17a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/df32ff1e-891f-3cfe-d772-67a574b4ddeb.png)
アクターの名前を表示するため、**Get Object Name**で取得した文字列をテキストブロックに代入します。
![A17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/75fc773b-bcc5-92bc-1684-d9ea4c97ab32.png)
コンテンツブラウザでEUWを選択し、右クリックして「Run Editor Utility Widget」をクリックするとEUWが走ります。
![A18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d0e3d303-010f-4740-2de9-139d396a85fa.png)
オブジェクトを選択するとアクター名とそのプロパティが閲覧・編集できるようになっています。
![A19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5fa8fe45-f18b-1b0a-af8a-5539c8b6442d.png)
作成したアクター「BP_CommonSound」を配置して選択すると、手軽にサウンドのプロパティが変更できます。
![A20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6f8a5e50-8c84-5220-b620-7dfcd72b12f3.png)

しかしこれでは、通常のDetailsパネルをいじるのとあまり変わらない気もします……。
そこで、「BP_CommonSound」クラスのアクターを選択したときのみ編集可能とし、表示するプロパティも制限してみるてことにしましょう。


## EUWで編集できる項目を制限する

まずはアクター「BP_CommonSound」を開きます。
作成した変数のプロパティにおいて、「Category」を任意の名前にしておきます。
ここでは「Editable」（編集可能）としました。
![A21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/35471e1a-da04-8eed-38a0-a10054178855.png)
一度入力したカテゴリー名はプルダウンメニューに登録されます。
EUWで参照した変数すべてのカテゴリーを同じものにしておきます。
![A22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d6af9c49-0287-bdc1-9554-5699434ad2e1.png)
EUWに戻ります。DetailsViewを選択し、「Categories to Show」の項目を＋ボタンを押して追加します。
![A23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d263bb76-685f-c02e-58dd-68afc1272761.png)
先ほどと同じカテゴリー名「Editable」を入力します。
これで「Editable」カテゴリーのプロパティのみがEUW上に表示されるようになります。
![A24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7ae963ba-0c6b-b5f9-2e7b-58f5048f5d2d.png)
グラフに移動し、現在選択中のアクターが「BP_CommonSound」クラスであるかを判別します。
お手軽にクラスを判別するには**Cast**ノードを使用します。
![A25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/121cd998-952f-f256-fe62-12c2aebfcce0.png)
Castが失敗した（アクターのクラスが「BP_CommonSound」である）場合はエラーメッセージを表示します。
DetailsViewには空のオブジェクトを**Set Object**しておきます。
![A26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/415efbc7-6bbf-5ff8-adbd-c4ba7fb2668a.png)
この状態で実行すると、EUW上に表示される情報が制限されすっきりして見えるようになりました。
![A27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3dff1bbd-53c1-fdd7-94f4-7d3f087ec240.png)
また、「BP_CommonSound」クラス以外のアクターを選択した場合はその旨が表示され何の情報も閲覧・編集できなくなっています。
![A28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3f6c6dfa-ee75-b958-b6ff-45e66f3890d0.png)

EUW上で公開する情報を適切に制限することで、情報の整理ができスムーズなデザインをすることができるでしょう。
マッチしないクラスを除外することで、不要な編集をして混乱してしまう、という事態を避けることもできます。
複数人や長期に渡る開発で特に役に立つ機能になるのではないでしょうか。