UE5+ADXで、ボイスや効果音の再生中に背景音量を下げる（ダッキング処理 / 新バージョン対応）

# はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5とサウンドミドルウェア「ADX for UE」を連携させ、ゲーム中などにキャラクターのボイスなどを再生する際、BGMやBGSの音量を下げることでプレイヤーを台詞に集中させる実装を紹介します。
また、重要な効果音や台詞の発声時にBGMを一時的にミュートすることで、「必殺技時の暗転」や「謎を解いた際のファンファーレ」などが効果的に演出できるようになるでしょう。

このように「あるサウンドを再生すると同時に他のサウンドの音量を下げる」処理は**ダッキング**と呼ばれています。
ボクシングで上半身を低くする回避テクニック「ダッキング」と同じ語源だそうです。


# 前提

UE5.3+「ADX LE UE SDK(2.01.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でREACTを設定する

AtomCraftでダッキングを設定するための機能が**REACT**です。
これは音量以外にも、AISACコントロールの値を変化させる用途でも使用できます。

今回はテスト用に3つのマテリアル（音源）を用意しました。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4e892686-b613-daaf-5973-84afdd6079de.png)

それぞれキャラクターのボイス、BGM、効果音となっています。


### カテゴリ、REACTの作成

まずはボイス、BGM、効果音を分類するために「カテゴリ」を作る必要があります。
プロジェクトツリーの「カテゴリ」を右クリックし、「新規オブジェクト」→」「カテゴリグループの作成」を選択します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/69e81fb3-068e-e889-2fb8-a9cb80ef5fe4.png)

ゲームのメイン部分で使用するカテゴリグループを想定して「Main」と名付けました。
さらにカテゴリグループ「Main」を右クリックし、「新規オブジェクト」→「カテゴリの作成」で詳細なカテゴリを作っていきます。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/159e5da1-0420-f49f-850c-54933c473701.png)

カテゴリグループ「Main」に3つのカテゴリを作り、それぞれ「BGM」「SE」「Voice」と名付けました。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9e19b33a-f79b-7bcd-d0f1-8ed8c646b9e4.png)

ダッキング処理のためのREACTを作成します。
プロジェクトツリーの「REACT」を右クリックし、「新規オブジェクト」→「REACTの作成」を選択します。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/65f88bac-b129-9b44-31b4-4e46c51a6400.png)

分かりやすい名前をつけ、ダブルクリックするとREACTの設定画面が開きました。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/32ee1c4d-dedb-4419-2a29-dda476d83710.png)

タイムラインの編集に戻りたいときは、画面下の「タイムライン」タブをクリックします。
![A06B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/23c23b0d-819c-251e-0c9b-49d9b23e3551.png)




### ダッキングの設定

ダッキングの設定をしていきます。
まずはこのREACTの用途をメモしておきましょう。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/11d49aac-2e26-5904-466b-ae752635d520.png)
ダッキング処理には、実際に変化させるカテゴリを指す「変化カテゴリ」と、そのトリガー（きっかけ）となる「トリガーカテゴリ」が必要です。
今回想定するシチュエーションではボイス再生中にBGMを小さくしたいので、**変化カテゴリが「BGM」、トリガーカテゴリが「Voice」と設定**します。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5925f045-02c5-12d6-60a7-79d090e00916.png)

REACTタイプは「ダッカー」のままで大丈夫です。

音量の遷移を設定していきます。
まずはボイス再生中のBGM音量を「変化レベル値」として「0.40」に設定します。
グラフが変化するので、視覚的に調整しやすいかと思います。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f5e4389b-a27d-f093-35ae-b1004f6ff943.png)

「変化時間」「戻り時間」はダッキング状態に遷移する際、通常状態に戻る際にかかる時間です。ミリ秒単位で指定します。
ボイス再生開始時はすぐにBGMの音量を下げ、戻るときはスムーズにすると自然な変化になりそうです。変化時間と戻り時間をそれぞれ「300」「600」としてみました。
ミリ秒単位なので、「300」では0.3秒で遷移することになります。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/40abc9bc-f337-313b-2bd5-f75e21bd894c.png)

「変化カーブタイプ」「戻りカーブタイプ」で遷移する際のカーブを指定できます。
変化カーブタイプは「高速変化」、戻りカーブタイプは「低速変化」にしてなめらかな谷状のグラフにしました。
グラフの形が画像のようになっていれば大丈夫です。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/196a2d5c-792a-ba3f-e8b2-e055cf0d91fb.png)

ホールドタイプが「再生中」では、ボイスが再生されている間ダッキングが維持されることになります。
ホールドタイプを「固定時間」にすると、ボイス再生時に指定の時間だけダッキング状態になります。
用途を考えると、今回は「再生中」が適切でしょう。
![A12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4b8eb2ca-2709-1321-f868-8cef385ca07e.png)

ホールドタイプが固定時間の場合、「ホールド時間」の項目でホールド時間を指定することができます。



### キューにカテゴリを設定する

キューを作成し、カテゴリを設定することでダッキングが実現します。
マテリアルに合わせて3つのキューを作りました。

![A13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3698f0ac-293c-be63-0970-b827600f8fd9.png)
単純にマテリアルごとにキューを作りたい場合、該当のキューを複数選択してキューシートへドラッグ&ドロップすれば即座に生成されます。
![A13B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/df4ecad9-ff94-f166-8597-2583f57b0254.png)

キューを選択し、インスペクターの「カテゴリ」をクリックします。
![A14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d8cab00b-05d8-ddd6-bb1b-3524ff921e20.png)

カテゴリの編集ウィンドウが開くので、該当するものにチェックをつけます。
![A15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/10996753-15d1-9a54-abb5-94f74d7fa297.png)

すべてのキューに対して行います。
![A16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/805889af-95c4-edcf-f526-f2150cbdb984.png)



### キューシートのビルド

ここまでできたら、キューシートをビルドしてUEに持っていきます。
![A17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3a3bef77-174a-05e1-5277-42995b3bc270.png)
![A18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e5f10f6f-80fc-7ec6-736a-e79c20c23839.png)





## UE5でサウンドを再生する

### キューシートのインポート

ビルドしたacf、acbファイルをコンテンツブラウザ（コンテンツドロワー）上の任意の階層にインポートします。
acfファイルインポート時に出てくるダイアログではどちらも「Yes」を選択します。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1e5c52c0-a23c-94ea-6870-d91d71126850.png)
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2a6d07b9-2226-ba49-46c8-ef4bff478c6b.png)
これにより、Atom Configファイルがプロジェクトに自動的に設定されます。
2つのアセットがインポートされました。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/85967cc0-77f6-291e-7ff0-02b99e44daef.png)
キューシートアセットをダブルクリックして開き、中に3つのキューが格納されていることを確認します。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/71177d79-635b-4ae4-2fbf-9d082bd9d674.png)



### BGM、ボイスを再生する

まずはBGMを直接配置してしまいましょう。
キューシートを開き、BGMとなるキューをレベルにドラッグ&ドロップして配置します。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b0563d61-5762-d83c-d490-507b41e275d8.png)

ボイス再生処理をレベルブループリントに書いてテストします。
レベルブループリントを開きます。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9c7ff9db-b15e-b3c3-edc6-e7a0ea3fc9da.png)

**Input Key**と**Spawn Sound at Location**を使い、キューの再生用イベントを用意します。
**Spawn Sound at Location**ノードは同名のものがふたつありますが、**Atomカテゴリのノードを使用します**（重要）。
![B07a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/11b50226-4b97-6c46-c810-6c27f80d7e77.png)

![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/db7fd7a1-7026-da7b-ef9a-dc9d83374ac9.png)

**Spawn Sound at Location**ノードのアセットピッカーではまずキューシートを選択し、それからキューを選択します。今回はボイスを再生するアセットを選択します。
![B08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/17f64875-ca76-30d2-3859-6f078647bd5d.png)
再生処理ができました。
![B09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3d8d0bcc-e3dd-8a61-f1b8-4b2ab6ff931c.png)
同じように効果音を再生するノードを配置します。
![B10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5c1676a3-68f1-54c0-83e4-6b4fa386f67c.png)


ゲームを実行してみましょう。効果音を再生してもBGMの音量は変わりませんが、ボイスを再生するとBGMの音量が抑えられ、キャラクターの音声が聞き取りやすくなるはずです。
また、ボイス再生時には即座にBGMの音量が下がり、ボイスの再生が終了すると段々とBGMの音量が戻ることにも注目してみてください。
これはAtomCraftで設定した「変化時間」「戻り時間」に依存した挙動です。
![B08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/67d47f2f-9abd-3b9a-5a3d-41b38fa91f5a.png)
もし効果が分かりづらいなと感じたら、AtomCraftで**REACTの「変化レベル値」を下げたり、「変化時間」「戻り時間」を長めに設定して**みてください。

ダッキング処理により、重要なキャラクターの演技や謎解きを完遂した際の効果音などを優先して再生することができます。ユーザーに向けて強調したいサウンドを際立たせ、演出の一助にしてみてください。