0
0

More than 1 year has passed since last update.

ADX+UEで、一定範囲内の音のパラメータを一括で変更する(ランタイム)

Last updated at Posted at 2022-10-11

はじめに

アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を使って配置したサウンドについて、指定した一定範囲内にあるサウンドのパラメータを一括で変更する実装についてです。

想定されるシチュエーションとしては

  • 「街の路地裏に入ると、大通りで鳴っている音を一括で減衰させる」
  • 「キャラクターが『範囲内の音を消す魔法』を使って隠密行動をとる」
  • 「大きなクリーチャーの轟音で周りの音がかき消される」

などの演出が考えられます。

ひとつひとつリファレンスを取得してパラメータを代入するとどうしてもノードがかさみがちですが……
D01.png
当記事の実装ではある程度スマートなグラフに抑えることも可能になります。
D02.png

前提

当記事ではUE4.26.1を使用します。基本的にブループリントのみでの実装を想定しています。
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

実装

既にサウンドオーサリングツール「AtomCraft」で効果音をビルドしていることが前提になります。
AtomCraftの使い方については、上記の導入編、実践編を参照してください。

専用のアクターの実装

キューの再生用アクターを用意する

お手軽にサウンドを配置、管理するためのアクターを作ります。
コンテンツブラウザの空欄で右クリックし、「Blueprint」を選択。
A01.png
親クラスは「Actor」にします。
A02.png
アクター内にふたつコンポーネントを追加します。
サウンドを再生するための「Atom」コンポーネント、範囲内にあるサウンドを一括で感知するためのコリジョン(当たり判定)となる「StaticMesh」コンポーネントです。
コリジョンさえ設定されていれば、メッシュは何でもかまいません。
A03.png

コリジョンの調整

テスト用にはそのままでいいのですが、実際に運用する際にはプレイヤーやキャラクターのコリジョンと干渉しないよう、コリジョン設定を調整してあげると良さそうです。
アクター内でStaicMeshコンポーネントを選択して、Detailsパネルの「Collision」で設定できます。
A07.png
この設定によっては後述の処理がうまく動かなくなったりするので、先に一通りのテストを終えてから調整することをオススメします。

変数を追加する

4つの変数を追加します。
A04.png

  • 「Sound」: Sound Atom Cue型。再生するサウンドを指定します
  • 「Volume」: float型。サウンドのボリュームを指定します
  • 「Pitch」: float型。サウンドのピッチを指定します
  • 「AutoActivate」: Bool型。サウンドが自動で再生開始されるかを判定します

すべて目玉のアイコンをクリックし、外部からアクセス可能にしておきます。

初期パラメータ用のConstruction Script

変数をAtom Componentのパラメータに反映するためのConstruction Scriptを用意します。
実装例は次のとおりです。
A05.png

これでお手軽にサウンドを配置、設定できるアクターができました。
A06.png

効率的な配置作業のために

こういったアクターの配置、初期パラメータの設定を効率的・視覚的にする方法について、過去の記事で解説しています(今回の実装には必須ではありません)。

ADX+UEでサウンドの配置作業を効率化する
https://qiita.com/SigRem/items/efd9a7b9aef44f463d73

ボリューム内にあるサウンドを取得する

サウンドを雑多にレベル内に配置してみましょう。
B01.png
(白い球体がサウンド用のブループリントです)

範囲を設定するためのボリュームを配置します。
デフォルトで配置できる「Box Trigger」などを置くといいでしょう。
B02.png
B03.png
スケールをそのままいじってもいいですが、取り回しをよくするためDetailsパネルの「Box Extent」でサイズを変更する方が良さそうです。
B04.png

Box Triggerを選択したまま、レベルブループリントを開きます。
B05.png

イベントグラフの空欄で右クリックし、「Create a Reference to (選択中のアクター名)」でリファレンスノードを作ります。
B06.png
B07.png
リファレンスノードから線を引き出し、Get Overlapping Actorsノードで特定のクラスのアクターだけを取得します。
「Class Filter」は今回作成したアクター名を指定します。
B08.png
For Each Loopノードで取得したアクターごとに同じ処理をかけます。
Print Stringで取得したアクターの名前(Get Object Name)を出力します。
B09.png
実行してキーを押すと、ボリューム内のサウンドがリストアップされていることが分かります。
B10.png

特定のボリュームに入ると、一定範囲内のサウンドのパラメータを変更する

ひとつの実装例として、「特定の地点まで進入すると、一定範囲内のサウンドが減衰する」演出を作ってみます。
レベル上にもうひとつのボリュームを配置します。
C01.png
このボリュームを選択した状態でレベルブループリントを開きます。
右クリックして「Add On Actor Begin Overlap」でボリューム進入時のイベントを作成します。
C02.png
イベントを開始するノードが作られました。
C03.png

Branchノードで進入したのがプレイヤーキャラかどうかを判別します。
C04.png
Trueの場合、先ほどの処理のようにボリューム内のサウンドアクターを取得します。ノードはコピペでかまいません。
C05.png
アクター内のAtomコンポーネントにアクセスするために、Castノードをはさむ必要があります。
C06.png
Set Volumeでサウンドのボリュームを「0.1」に設定します。
C07.png

これでテストしてみると、ふたつめのボリュームに入るとひとつめのボリューム内のサウンドのボリュームが一括で「0.1」となり、聞こえにくくなります。
C08.png

同じようにボリュームから退出した際のイベントも作れば、プレイヤーが元の位置に戻った際に聞こえてくるサウンドのボリュームも元に戻ります。
C09.png

今回は単純にボリュームの変更でテストしましたが、Aisacコントロールやセレクタなどの細かいパラメータにも干渉することができます。
いちいちリファレンスノードを持ってくる必要がなく、参照漏れなどのバグを生みにくくなりますし、デザイナーが範囲を詳細に指定できることで意図通りの演出もしやすくなります。

0
0
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
0
0