はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事は、UE5のGameplayTagとADX for UEを組み合わせてサウンドを管理する基礎編の 発展編 です。基礎編では、UE5の機能であるGameplay Tagでサウンドを識別し、DataTable経由で再生する仕組みを作りました。
UE5 + ADXで、サウンドをタグによって管理・再生する
発展編ではその仕組みを活かし、実際のサウンドデザインに使用できる実装を紹介します。
今回の記事では環境音アクターを配置し、それらにタグ付けをしてサウンドを再生する手法を扱います。
基礎編と同じように、後からサウンドの差し替えに対応しやすく、またタグ単位という大まかな設定さえしておけば後でいくらでも調整が効くという利点があります。
また、サウンド配置と実際のサウンドデザインをレベルデザイナーとサウンドデザイナーで分業、という活用もできそうです。
環境音の再生はブループリントから呼び出せるだけでなく、「定期的に一定確率で再生」「不定期に再生」「プレイヤーキャラが近づいたら再生」などの再生トリガーを設定できるよう作っていきます。
当記事ではUE5.7 及び 「ADX LE UE SDK(2.05.01)」を使用します。
また、基本的にブループリントのみでの実装を行います。
ADX for UEはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/
前提
「ADX for UE LE」を使用します。導入や簡単な使い方は以下の記事にあります。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)
ADX for UEの導入で、一歩上のサウンド表現を(実践編)
基礎編の仕組みを使用します。先にこちらを参照いただけると行程がイメージしやすいと思います。
UE5 + ADXで、サウンドをタグによって管理・再生する
実装
環境音用のタグとキューを用意する
まずは環境音用のタグを定義します。プロジェクト設定を開きます。

「GameplayTags」タブの「Manage Gameplay Tags」からタグのマネージャを開きます。

サブタグとして「Ambient」を追加しました。階層は「Sound.Ambient」となります。
「Sound.Ambient」下に、さらにサウンドの識別となるサブタグを追加します。
例:
-
Sound.Ambient.Bush: 茂みの音 -
Sound.Ambient.Fire: 焚き火の音 -
Sound.Ambient.River: 川の音(ループ) -
Sound.Ambient.Wind: 風の音
AtomCraftでキューを用意する
AtomCraftで素材及びキューを用意します。
マテリアルをインポートします。フォルダ分けしておくと整理しやすいです。

川のせせらぎなど、ループさせたい音はマテリアルを選択し、インスペクターにてループ情報の上書きをします。

ワークユニットを右クリックし、「新規オブジェクト」→「キューシートの作成」をします。

新しいキューシートに名前をつけます。

今回使用するマテリアルをキューシートにドラッグ&ドロップし、それぞれについてキューを作ります。

キューシートをビルドし、UE5のコンテンツドロワーにドラッグ&ドロップしてインポートします。
タグとキューを紐づけるデータテーブルを開きます。
今回使用するタグとキューの対応表を追加します。
環境音再生用アクターを作る
新規にアクターを作ります。
コンテンツドロワーの空欄で右クリックし、「Blueprint Class」を選択。

親クラスは「Actor」です。

「BP_AmbientSound」と名前をつけました。

ダブルクリックして開きます。
キューを再生するため、「Atom Component」を追加します。

鳴らす環境音を指定するための GameplayTag 型の変数を追加します。

閉じた目玉のアイコンを押し、開いた状態にし変数を公開(Instance Editable)しておきます。

データテーブルも変数として作っておきます。

コンパイルし、デフォルト値として入力したデータテーブルを設定します。
ここを差し替えると、別のタグ⇔キュー対応表を使用することもできます。
ゲーム内の舞台となる地域が変わった際に、環境のサウンドを一括で変化させる、といった演出に使用できます。

サウンド再生イベントを作る
アクターに設定されたGameplayTagからデータテーブルの行を見つけ、対応するキューを再生する処理を書きます。
内容は前回記事のものとほぼ同一です。

データテーブルに対応する行が見つからなかった場合のエラーメッセージも出しておくと安全です。

レベルにアクターを配置します。
Detailsパネルでは、公開したパラメータとして「Sound Tag」が個別に設定できるようになっています。
ここに再生したいサウンドとなるタグを指定します。

現在はカスタムイベントを呼ぶ手段がないため、テスト用としてレベルブループリントから呼んでみましょう。
キーを押してサウンドが再生されたら成功です。

定期的に環境音を再生する処理
レベル内で自動的に環境音が再生されるよう処理を組んでいきます。
カスタムイベントを作ります。名前は「PlayPeriodicSound」(定期的なサウンドを再生)としました。
Random Float in Rangeノードで乱数を出し、規定の確率で再生されるようにします。
画像のノードの例では、変数「Play Chance」の確率で再生されます(Play Chanceが0.7なら70%)。
先に作ったカスタムイベントPlay Ambient Soundイベントを呼び出します。

Event Begin PlayにSet Timer by Eventノードを置き、PlayPeriodicSoundが定期的に呼び出されるようにします。
この場合、「Looping」にチェックをつけて何度も発火されるようにします。
不定期の再生の場合、外します(後述)。

不定期に環境音を再生する処理
自然の中の環境音は一定間隔で鳴ると不自然に聞こえます。そこで、処理を少し変えて不定期の再生にします。
この処理は変数の値により定期的な再生としても使えるので、加えて実装しておくといいでしょう。
Set Timer by Eventノードの「Looping」のチェックを外します。

Play Periodic Soundイベントの末尾に、再びPlay Periodic Soundを呼び出す処理を入れます。
ここでは変数「PeriodicInterval_Min」「PeriodicInterval_Max」の間からRandom Float in Rangeでランダムな間隔が出るようにします。

プレイヤーが近づいたら環境音を再生する処理
お次はプレイヤーキャラクターの接近を検知し、サウンドを再生する処理です。
SphereCollisionコンポーネントを追加します。

Construction Scriptを開きます。
My Blueprintか上部のタブから移動できます。

変数「SphereRadius」を追加します。
これは接近検知範囲の半径になります。値が「0.0」のままだと機能しませんので、コンパイルして「200.0」などの適当な数値を入れておいてください。

SphereCollisionコンポーネントを右クリックし、「Add Event」→「Add OnComponentBeginOverlap」でコリジョンに重なった際のイベントを追加します。

重なったのがプレイヤーキャラクターであるか判別し、TrueならPlayAmbientSoundでサウンドを再生します。

これで処理はできているのですが、現状だと検知範囲ぎりぎりの場所を反復横跳びするだけで連続でサウンドが再生されてしまうことになります。
それを改善するため、もうひとつSphereCollisionコンポーネントを追加します。
既存のものを「InnerSphere」、新しいものを「OuterSphere」とします。
OuterSphereはInnerSphereより大きく、「InnerSphereに入ればサウンド再生し、OuterSphereから出れば再度再生許可フラグが立つ」という形で連続再生を阻止します。

Construction Scriptでそれぞれの半径を反映します。

変数「bAllowPlay」を追加します。再生許可フラグです。

コンパイルし、デフォルト値をTrueにします。

InnerSphereにプレイヤーが進入するとサウンドを再生し、「bAllowPlay」をFalseにし再び再生されないようにします。

OuterSphereコンポーネントを右クリックし、「Add Event」→「Add OnComponentEndOverlap」を選び退出時イベントを配置します。

こちらでは退出時に「bAllowPlay」をTrueにします。

配置されたサウンドごとにトリガーを変える
これらの処理をひとつのアクターで使い分けられるよう、再生タイプを設定できるようにしてみます。
コンテンツドロワーで右クリックし、「Blueprint」→「Enumeration」を選択します。

名前を「EAmbientSoundPlayType」としました。

ダブルクリックして開き、要素を追加します。

それぞれ外部から呼び出す想定の「Event」、定期的なイベントにより再生が発火する「Periodic」、プレイヤーが近づくことで再生される「SphereTrigger」としました。
この内「Event」は便宜的なもので、アクター単体では再生を発火しません。あくまで外部のアクターやロジックから呼び出すものとなります。

「BP_AmbientSound」を開き、変数を追加します。型は先ほど作った「EAmbientSoundPlayType」です。

それぞれのイベント前に、該当する再生タイプであるかを判定します。


これで基本的なGameplayTagによる環境音の再生処理が完成しました。






