ADX + UE5で音量コンフィグを実装

# はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5とサウンドミドルウェア「ADX for UE」を連携させ、
BGMや効果音、ボイスなどを個別に音量調節できる機能を作成します。
ゲームなどにおける、いわゆる「音量コンフィグ」ってやつです。

完成図はこんな感じです。
![D11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a05ba84d-c2b2-2528-ee03-5d8c5d52b763.png)
UIのスライダーを操作すると、対応したサウンドの音量が増減します。

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

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

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

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

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

# やること
- AtomCraftでサウンドをカテゴリ分け
- UE5にインポート
- UMGでUI作成
- ブループリントで音量コンフィグを実装
- テストプレイ

# 実装

## AtomCraftを使い、サウンドをカテゴリごとに分ける

### プロジェクトの作成
AtomCraftを起動し、今回のためのプロジェクトを作成します。
![E01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a26de2d8-238d-4c24-f42f-05c884aa1e69.png)



### サウンドのインポート
サウンド素材をインポートします。
今回は「BGM」「SE」「UI」といった3つのカテゴリを想定し、それぞれ名前をつけた素材を用意しました。
素材をインポートします。
![E02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d92dd4a3-ddd7-965a-a2ff-0f8c3978643b.png)

キューシートにインポートした素材をドラッグ＆ドロップし、独立したキューを作成します。
![E03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/250d83be-be66-1215-daba-6c56cccc4d8b.png)
![E04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5075c709-00aa-f8a3-5a1a-ecb972043046.png)



### カテゴリを作成する
サウンドをカテゴリ分けするには、まずカテゴリそのものを作る必要があります。
AtomCraft上部の「プロジェクトツリー」から、「カテゴリ」を見てみましょう。
![E05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/61df6723-4e02-8df2-aa58-1c46619d4693.png)

ダブルクリックして展開していくと、カテゴリグループとカテゴリ名が現れます。
![E06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/52b12a51-1c4e-b2ff-7d76-a2304145b9f2.png)

「カテゴリ」が、さらに「カテゴリグループ」に分けられる理由は後ほど解説します。

今回は「CategoryGroup_0」内に3つのカテゴリを作っていきます。
「**CategoryGroup_0**」を右クリックし、メニューより「新規オブジェクト」→「カテゴリの作成」を選択。
![E07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/20e6dd43-59d8-41db-45b6-072bce39738d.png)

新しいカテゴリが作られるのでリネームします。右クリックのメニューから名前を変更してもいいですし、該当のカテゴリを選択してF2キーでもリネーム可能です。
![E08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/86ab3505-6e8e-1490-430d-992bd6116ef9.png)

同じように「SE」「UI」も作成。
![E09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2eb49718-1074-5483-b5d9-a162da4a10ef.png)



### キューをカテゴリ分けする
任意のキューを選択し、AtomCraft右側のインスペクター内、「カテゴリ」をクリックします。
![F01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/26cc360b-8063-6986-9090-356a482e5b5b.png)

カテゴリを編集するウィンドウが現れるので、適切なカテゴリにチェックをつけます。
![F02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/dc741e9c-0b2e-8146-6ca1-99f29c723fa0.png)

カテゴリに「BGM」が設定されました。
![F03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6abc39d5-9862-8002-50af-c31b4f002230.png)

同じように、他のキューに対してもカテゴリを設定します。

### カテゴリグループの用途
キューに付加できるカテゴリはひとつに限らず、**カテゴリグループを分けることで、キュー自体が複数のカテゴリを持つ**ことができます。
カテゴリグループはプロジェクトツリーから新規追加できます。
![F04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6d2f0306-11b4-464e-0adb-7de5a1cc300e.png)

キャラクターボイスというカテゴリと、キャラクターの種類ごとに音量調節する想定でカテゴリを作ってみました。
![F05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a64b3827-3889-f1ec-ebe8-867b32f77a17.png)

カテゴリ編集ウィンドウで設定すると、キューが「Voice」カテゴリと「Char_Monster」カテゴリを同時に持つことができます。
![F06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/bdb8bf0f-e15c-3665-ee27-954c8f029cfa.png)

これでゲーム中に「モンスターの鳴き声だけを有効にしたい」と思ったら、**「現在のボイス音量設定を反映しつつ、モンスター以外のキャラクターボイス音量を小さくする」**という処理が実現できるわけです。


### キューシートのエクスポート
プロジェクト内でキューシート名が被る可能性がある場合、キューシートをリネームしておきましょう。
![F07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0ae1338a-36d5-7cc5-fac3-3778a2ab6dd7.png)


キューをカテゴリ分けできたら、キューシートをビルドします。
![F08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9721041f-b390-cec1-2c63-eab861d3459d.png)

これでAtomCraft側の作業は完了です。



## UE5へのインポート
UE5を起動し、任意のフォルダにAtomConfigとキューシート（acb, acfファイル）をインポートします。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0bf3bda4-41fa-249d-d8a8-5effa228b462.png)

キューシートアセットを開き、音声が再生できることを確認します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9bc2ba73-5d0a-8ef1-4c18-6f899267ac8d.png)


###サウンドのテスト再生
レベルを新規作成し、適当にサウンドを配置します。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/553eea70-7e21-ffbc-1166-c52200d805ff.png)

サウンドがプレイ開始時に自動再生されないよう、Detailsパネルから「Auto Activate」のチェックを外しておきます。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a620ce63-7e80-e238-1cfa-5465080042a0.png)

これらのサウンドを再生するための簡単なテスト処理を作ります。
まずは配置した3つのキューを選択しておきます。

![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a3ac6e18-cdd2-aecc-39a1-fcc975eaae66.png)

**選択した状態で**レベルブループリントを開きます。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/51a4a411-885c-8260-e1a0-a79b23479156.png)

イベントグラフ上の空欄で右クリックし、「Create References to 3 Selected Actors」（選択した3つのアクターに対してのリファレンスを作成）を選択します。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8fa95820-9a6c-eff9-693f-20461324503d.png)

リファレンスノードから線を引き出し、「Play(AtomComponent)」を選択します。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/77fb7401-cc40-72b6-9c41-e944777c0c8d.png)
これでサウンドを再生するためのノードができました。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8480e803-088b-065e-bfbf-2a84e77d87f9.png)
他ふたつのリファレンスノードに対しても同じようにノードを作成します。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d576daf9-aa70-802f-1094-3defb0c82860.png)
**Input Key 1**ノードを配置し、「1」キーを押したらサウンドが再生されるようにします。
他のノードに対しても、「2」キー、「3」キーで再生されるよう組みます。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/400eb356-f3ca-bcd7-19cc-ee3e653bc508.png)

一度テストしてみましょう。
各キーを押して、サウンドが再生されるか確認します。

サウンドが再生されているか確実に確認するためには、コンソールコマンド「atom.3dVisualize.Enabled 1」を使用すると便利です。
![A13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0c15fdb8-8a74-ba02-b8f6-998cf204a1c2.png)
![A12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/76225ca6-0628-0de4-f27c-a74ed57174e8.png)



## UMGでUIを作成
今回はUE5標準のUMGを使用し、音量調節用のUIを実装します。

### ウィジェットを作成
適当なフォルダを作り、コンテンツブラウザで右クリックして「User Interface」→「Widget Blueprint」で新しくUIを作ります。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1e4e5f09-b105-5600-37dc-3e9c3e5d3b92.png)
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ec60be1f-f359-2070-8f50-0e054496223b.png)

ダブルクリックすると、UMGのエディタが開きます。
![B08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/64bdc2f2-3f73-8af8-2c4c-fd028b27c38c.png)


### UIをデザイン

まずは他のUIパーツを置くための「下地」を作ります。
エディタ左上の「Palette」パネルから「Canvas」をドラッグ&ドロップします。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/98336ca2-3764-6568-55f3-9a970815df65.png)
枠が現れ、この上に様々なパーツを配置できるようになりました。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b97bcde6-ef88-66a0-3d86-73c98b480206.png)

今度は「Palette」パネルから「Slider」をドラッグアンドドロップすると、今回音量変更に使うスライダーが現れます。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b5eba7c7-3425-45e2-036b-f60015fed633.png)

同じように「Text」をドラッグアンドドロップし、テキストも呼び出します。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2fd76a32-21de-9b25-7e16-21204aa6efae.png)

エディタ左側のDetailsパネルで文字列やスライダーの大きさなどが操作できます。
![B08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/77d2498d-643b-cf6d-12ba-13a12c906856.png)

ここで各パーツの名前なども設定しておくと、後で分かりやすいです。
![B09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8a99d3a6-d6a5-d9fa-2a8e-fdd2a7366d6c.png)



これを3つぶん作ります。UIのパーツに対して、コピペなども使うことができます。
![B10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a7aaf4ed-4b9a-0eeb-2bf9-20fbfe06c20e.png)

デザインというにはおこがましいですが、簡易的なコンフィグができました。
Detailsパネルでフォントを多少大きくしています。

### アンカーを設定し、表示崩れを防ぐ
UMGを既に使われている方ならご存知かもしれませんが、ゲーム中はウィンドウサイズなどに合わせてUIの表示が崩れることがあります。
これを防ぐのが「アンカー」です。
UIのパーツを選択し、Detailsパネルの「Anchors」をクリックします。
![B11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6cde84b8-65a9-3c7e-62a5-90a9669656fe.png)

今回はこのUIを画面の真ん中に表示するので、真ん中に四角があるボタンをクリックします。
![B12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1a508fcb-a80a-3fb2-7691-fad9588d871a.png)

これでこのパーツの基準点が真ん中になり、ウィンドウがサイズが変わった場合でも、ウィンドウの中心を基準として座標が設定されます。
![B13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7dd00446-5ce4-1de9-fd12-242ccd63d6fc.png)

**すべてのパーツのアンカーを同じように中心に設定**しておいてください。
アンカーを統一することにより、数値での座標指定が揃えやすくなります。
![B14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3dd65ba4-4066-fc50-2520-1cf8482fe397.png)

ウィンドウの枠となるよう、「BackGround Blur」を配置します（必須ではありません）。
![B15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f1663ae6-6a72-df3d-da37-85e286f28732.png)
こちらはスライダーやテキストよりも背面に来てほしいので、Detailsパネルにて「ZOrder」を「-1」にします。
![B16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d3b47d6f-9293-9483-458e-c27d72bc6f1e.png)
「Blur Strength」でブラーの量が指定できます。
![B16b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6dd9fe8f-ff4d-4e00-6364-c817a07e1fd8.png)

簡易なコンフィグウィンドウができました。
![B17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/351a484d-5b20-9a76-3f47-b1fb878f06fe.png)






## ブループリントで音量コンフィグを実装

### ブループリントエディタを開く
今回は、UI自体が音量コンフィグの処理を持つものとします。
画面左上の「Graph」ボタンをクリックすると、ウィジェットのブループリント編集へと移ることができます。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f88b2854-806a-7a78-2980-60103015a2b5.png)
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0c947d73-7ce4-a22e-e744-65fc541fae31.png)


### ノード配置
「My Blueprint」パネルの「Variables」内に先ほど作成したスライダーがあります。
![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/eb3f96e2-b8d0-0b7e-5330-587de23c512b.png)


「Slider_BGM」を選択し、下部のDetailsパネルの「Events」にある「On Value Changed」の右の「+」ボタンを押します。
これで**このスライダーの値が変更された際に発火されるイベント**が作られます。
![C04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/116e1e37-819a-95ea-b856-181a980c96e4.png)
**On Value Changed(Slider_BGM)** が配置されました。
![C05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0ba8c70b-eec9-1959-3048-5e46af8b5e06.png)
ここから今回の主目的である、カテゴリ内の音量を一括して変更するには**Set Category Volume by Name**ノードを使用します。
![C06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fb773856-5947-c74e-098a-b78344bbc9e9.png)
「Category Name」を「BGM」とし、**On Value Changed**ノードの「Value」ピンから「Volume MultiPlier」に線をつなげばOKです。
![C07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/000b60bf-e063-fa84-d157-f3ac893d1bf7.png)
他のスライダー、カテゴリについても同じようにノードを配置します。
![C08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/98f75954-6336-d004-9de0-5c2953127289.png)


これで音量調節ができるようになりました！さっそくテストしてみましょう。


## テストプレイ

### レベルブループリントからUIを呼び出す
実装はできましたが、UIをゲーム中に表示する処理はつくられていません。
レベルブループリントからUIを呼び出してみましょう。

![D01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/bd7d48b1-b6c1-e2c8-697a-704607ecd788.png)

**Event Begin Play**ノードから**Create Widge**ノードを配置します。
![D02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/cdafcc67-62cd-b042-b863-7d40f291a859.png)

（ノードを配置すると**ConStruct NONE**という名前に変わりますが問題ありません）
「Class」に先ほどのUIを設定します。
![D03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2ebbea41-2990-c6f8-a31f-ac7599c4f71e.png)

さらに**Create Widget**ノードの「Return Value」から線を引き出し、**Add to Viewport**を配置します。

![D04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a7668dd0-02e6-1523-4fcc-1da4aee04b52.png)
![D05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0bd33404-1310-76e9-e22f-006c4f77d02e.png)


UIをマウスで操作するには、ゲーム中にマウスカーソルを呼び出す必要があります。
**Get Player Controller**ノードを配置します。
![D06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0f6d7596-1d16-08b9-55a6-d488418dc439.png)

**Return Value**から線を引き出し、**Set Show Mouse Cursor**ノードを配置します。
![D07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1f9fde04-438e-5635-cd53-478647d5ed82.png)
**Set Show Mouse Cursor**ノードのチェックボックスにチェックを入れます。
![D08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/72f47b8b-92a2-5a7f-23f0-ea8bfa3653da.png)


最終的なノード全体図は以下のようになります。
![D09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5e2cd7d6-693f-e940-46b6-22dd554ebc94.png)


ビューポートの「Play」ボタンを押すとゲームが開始され、音量コンフィグウィンドウも呼び出されるはずです。
![D11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a05ba84d-c2b2-2528-ee03-5d8c5d52b763.png)

各スライダーをマウスで動かし、1,2,3キーでのテスト再生をして音量が変わっているかを確認してみましょう。
（画像では視認性向上のため、「BackGround Blur」と同じ座標に「Image」で黒い長方形を表示しています）