2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ADX+UE5で、ゲーム中に存在するキャラクターに応じて環境音を変化させる

Last updated at Posted at 2023-04-27

はじめに

ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5とサウンドミドルウェア「ADX for UE」を連携させ、「ゲーム中に登場しているキャラクターに応じて環境音を動的に変化させる」実装を行ってみます。

今回の実装例

たとえばゲーム内の街のマップや拠点において、NPCの数が多いほど街の喧騒音を大きくさせ、また鍛冶屋や商人がいる場合のみ専用の環境音を再生します。
「鍛冶屋がいれば金槌の音が聞こえ、商人がいれば商品をアピールしている声が聞こえる」といったように、よりいきいきとした環境音表現ができる効果が期待できます。ゲーム内世界の雰囲気を演出するのに一役買うでしょう。
また、マルチプレイのゲームにおいても、近くにいるプレイヤーの数に応じて喧騒を大きくする、といった活用法も考えられます。

注意点として、あくまで環境音としての実装のため、厳密に3D空間上に音を配置したい場合は該当部分のみアプローチを変える方法があるかもしれません。

例:街と群衆の喧騒のみこの記事の方法で実装させ、鍛冶屋や商人から発する音はアクターに紐づける形で配置する、等

前提

UE5.4+「ADX LE UE SDK(2.03.00)」を使用します(他バージョンにおいても、基本的に実装方法は同じです)。
基本的にブループリントのみでの実装を想定しています。
ADXはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/

なお、ADX2からADXへ名称が変更になりましたが、ツール構成は変更ありません(2がないから古いほう、というわけではありません)。

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

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

実装

AtomCraftで環境音を構成する

マテリアルの用意

まずは環境音の素材となるマテリアルを用意します。
今回用意したのは以下の4種です。

  • 基本の環境音となる「BGS_Town」
  • 鍛冶屋がいる場合に再生される「BGS_Town_Blacksmith」
  • 商人がいる場合に再生される「BGS_Town_Merchant」
  • キャラクター数に応じて音量が変化する、喧騒の環境音「BGS_Town_Crowd」

A01.png

すべての効果音について、インスペクターにてループするよう設定しておきましょう。
A02.png

キューの作成

街の環境音となるキューを作成します。統合された環境音としたいので、今回作成するキューはこの一つだけです。
ワークユニットツリーのキューシートを右クリックし、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選びます。
A03.png

作成したキューに、すべての環境音をトラック別に挿入します。
A04.png

Aisacコントロールの作成

トラック「Track_BGS_Town_Blacksmith」を右クリックし、「新規オブジェクト」→「AISACの作成」を選択してAisacコントロールを作ります。
A05.png

分かりやすいよう名前をつけますが、UE側では中段にある「AisacControl_00」の名前を使用します。
グラフタイプは「ボリューム」です。
A06.png

AISACリストから「ボリューム」を選択し、グラフを編集します。
A07.png

右肩上がりの単純なグラフにします。
右枠を「インスペクター」から「ポイントリスト」にタブを切り替え、数値を入力してもOKです。
A08.png

編集できたらスライダーを動かし音量の変化をチェックしてみましょう。
A09.png

チェックの際は、一時的に他トラックをミュートしてあげると分かりやすいかもしれません。
A10.png

同じように、商人用の環境音、喧騒用の環境音に対してもAisacコントロールを作成します。それぞれIDが異なるよう選択してください。
A11.png

すべてのトラックに対し、それぞれのAisacコントロールのグラフを同じように編集します。
画像では重なっているため一本のグラフに見えますが、実際は3本の線があります。
A12.png

スライダーを動かし、各トラックのAisacコントロールが正常に動いているかテストします。

キューシートのビルド

ここまでできたら、キューシートをビルドしてUEに持っていきます。
A13.png
A14.png

UEで環境音を変化させる

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

UE側のコンテンツブラウザ(コンテンツドロワー)に、ビルドしたacfファイル、acbファイルをドラッグ&ドロップしてインポートします。
ダイアログでは「Yes」を選択します。これにより、acfファイルがプロジェクトに設定されます。
B01.png
キューシートとAtomConfigのふたつのアセットがインポートされていることを確認します。
B02.png
キューシートを開き、正常に再生されるか確認しておきましょう。
B03.png

サウンドの配置

レベル上にキューを配置します。
B04.png

Detailsパネルにて、Aisacコントロールの初期値が設定できます。ゲーム開始状態では素の環境音だけにしたいので、初期値をすべて「0」にしておきましょう。
「Control Modulations」の要素を追加します。
B05.png

「AisacControl_00」~「AisacControl_02」の値を「0.0」にします。
B06.png

この状態でゲームを再生すると、プレーンな(NPCがいない状態の)街の環境音だけが聞こえるはずです。
B07.png

アクターを検知して鍛冶屋、商人の音を追加する

ブループリントを使用し、検知したアクターに応じて環境音を追加する処理を書いていきます。
検知対象となるアクターを作成します。もし既に目的のアクターを作ってある場合は省いて大丈夫です。
C01.png

「鍛冶屋」や「商人」は今回、親クラスを「Character」で作ります(それ意外のクラスで作っていても大丈夫です)。
C02.png

鍛冶屋となるアクターが作成できました。
C03.png

ダブルクリックして開きます。
C04.png

見た目が設定されていませんので、仮でメッシュを指定します。
アニメーションブループリントなども設定しておくと、Idleアニメーションが再生されていい感じかもしれません。
C05.png

レベルブループリントを開きます。環境音再生用のアクターを作成しても大丈夫です。
C06.png

右クリックして、「Add Custom Event」でカスタムイベントを追加します。
C07.png

今回は「UpdateTownSound」と名付けました。これは街の音を変化させるトリガーになります。
街の状態が変わったり、プレイヤーが街のマップに出入りした際に実行するといいでしょう。
C08.png

今回はテスト用として、仮で「1」キーを押してイベントを呼び出すようにしてみます。
C09.png

イベントが開始されたら、Get All Actors Of Classノードでレベル上のアクターを取得します。
まずは「Actor Class」に鍛冶屋となるアクタークラスを指定します。

このノードには「Out Actors」というアウトプットピンがあります。Array(配列)として検知したすべてのアクターのリストが取得できますので、Lengthノードでリストの長さを測ればアクター数が判明する、というわけです。
C10.png

試しにPrint Stringノードを使い、アクター数を文字として出力してみましょう。
C11.png

レベル上に鍛冶屋アクターを何体か配置し、ゲームを再生します。

レベル上に配置しているアクター数により、画面に出力される数字が変わるはずです。
C12.png
鍛冶屋を3体配置し、ゲーム再生中に「1」キーを押すと画面左上に「3」と表示されました。正常に取得できているようです。

正常に動いていることが分かったら、キューに対してAisacコントロールをかけていきます。
レベル上でキューを選択しておき、レベルブループリントに戻ります。
C13.png

右クリックし、キューのリファレンスノードを配置します。
C14.png

リファレンスノードから、AIsacコントロールを行うためのノードSet Aisac by Nameを作成します。
C15.png

対象のAisacControlを、鍛冶屋の環境音のボリュームを担当しているものに設定します。
C16.png

Selectノードを使い、「レベルに鍛冶屋が一人以上いればAisacコントロールの値を1に、いなければ0に」します。
C17.png
これで鍛冶屋の検知をし、いれば専用の環境音を鳴らす処理ができました。

同じように商人用のアクターも用意し、処理を組んでみましょう。
Characterクラスを継承したアクター「BP_Char_Town_Merchant」を作成しました。
分かりやすいように、鍛冶屋とは色を変えています。
C18.png

レベルブループリントに戻ります。
Sequenceノードでグラフを整理しましょう。
C19.png

鍛冶屋用のノードをコピペし、検知するクラスとAisacコントロール名を変更すれば完成です。
C20.png
コピペした後、変更すべきは画像内でマークした2箇所です。
C21.png

この状態でコンパイルすると、参照クラスを変えたためにエラーが出ることがあります。
C22.png

その場合はLengthノードを作り直し、コンパイルすることでエラーが解消されます。
双方との再接続を忘れないように注意してください。
C23.png
C24.png

キャラクター数に応じて喧騒の音量を変化させる

キャラクター数を自動で数え、その数に応じて喧騒の音を大きくしてみましょう。
Sequenceノードの「Add pin」ボタンを押し、ピンを追加します。
D01.png

鍛冶屋「BP_Char_Blacksmith」と商人「BP_Char_Merchant」は「Character」クラスを継承している子アクターですので、「Character」クラスの数を取得すると子クラスとして一緒にカウントされます。
Get All Actors Of Classノードを使用し、レベル上に存在する「Character」クラスのアクター数を数えてみましょう。
D02.png

Map Range Clampedノードで、取得したアクター数をAisacコントロールの値としてスケーリングして渡します。
キャラクターが一人もいなければ喧騒のボリュームは0ですが、数が増えるにつれボリュームアップさせます。
キャラクターが10人以上で喧騒のボリュームが最大になります。
D03.png

キャラクターを増やして「1」キーを押すとキャラクター数がカウントされ、喧騒の音量が変化するようになりました。
D04.png

さらにキャラクター数や施設などが増えた場合に、さらに賑やかな環境音を追加するなどの処理を追加すれば、より発展している街や拠点といった雰囲気も出せそうです。
プロジェクトの形態に応じて取り入れて、よりゲームの状態が反映された環境音を再生してみるのも面白いかもしれません。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?