0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UE5+ADXで、水深に応じて水中の音を変化させる

Last updated at Posted at 2023-07-13

はじめに

アンリアルエンジンとサウンドミドルウェア「ADX for UE」を連携させ、「水中の環境音や効果音を、水深に応じて変化させる」実装を行ってみます。

水面近くでは音が少しだけくぐもって聞こえ、深く潜るにつれて、段々と音が鈍く重く聞こえるようになっています。
A00.png

カテゴリ+グローバルAISACを使用して実装します。

前提

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

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

記事執筆時点のADX for UEのSDKバージョンはADX LE UE SDK(1.31.00.01)です。

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

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

実装

AtomCraftでサウンドを用意する

マテリアルのインポート

まずは効果音素材を用意します。
今回は最小構成として、環境音となる「BGS_UnderWater」、水中での効果音例である「SE_Impact」のふたつのサウンドを用意しました。
A01.png
環境音の「BGS_UnderWater」については、インスペクターにてループ情報の上書きを「True」、ループタイプを「ループ」と設定して、再生され続けるようにします。
A02.png

キューの作成

キューシートを選択し、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択してキューを新規に作成します。
A03.png
ふたつのマテリアルに対し、それぞれにキューを作っておきます。特別な設定は必要ありません。
A04.png

AISACコントロールの作成

環境音のキューを選択し、トラックリストの空欄にて「新規オブジェクト」→「AISACの作成」を選択してAISACコントロールを作成します。
A05.png
AISACの追加ウィンドウが出るので、AISAC名とグラフタイプを設定します。グラフタイプは音を鈍くする「ピッチ」を使用します。
A06.png
右肩下がりの簡単なグラフを作成します。
設定できたら再生しながら上部のスライダーを動かし、ピッチが下がることを確認してください。
A07.png
ふたたびトラックリストの空欄にて、AISACを作成します。今度はグラフタイプを「バンドパス - Cof高域」とし、高音を聞こえにくくしていきます。
A08.png
ここでも右肩下がりのグラフを作ります。
スライダーが最大の「1.0」まで到達するとギリギリ聞こえるくらいの塩梅で調整してみましょう。
A09.png

グローバルAISACの設定

スライダーを動かし調整して、聞こえ方に満足したら、作成したAISACコントロールを「グローバルAISAC」に変換します。これにより、他のキューにもこの聞こえ方が適用できるようになります。
(水中では一括して効果音にAISACコントロールを適用したいため)。

ワークユニットツリーでAISACコントロールを選択し、右クリックして「グローバルAISAC化」を選択します。
A10.png
プロジェクトツリーに「Aisac_Pitch」というグローバルAISACが作られ、元のAISACコントロールは名前に「Link」とつきました。
これはキュー側のAISACが、グローバルAISACの設定と同期されていることを表します。
A11.png
もうひとつのAISACコントロールについても同じようにグローバルAISAC化します。
A12.png
こちらも名前に「Link」がつきました。
A13.png
プロジェクトツリーのグローバルAISACを、他のキューにドラッグアンドドロップすると同じように「LinkAisac」が作られ、この効果音にAISACコントロールがかかった場合の聞こえ方を確認できるようになります。
A14.png
A15.png

カテゴリの設定

これらのAISACコントロールの影響を受けるキューを、「カテゴリ」機能で指定します。
プロジェクトツリーの「カテゴリ」フォルダを開き、カテゴリグループの中にあるカテゴリを任意の名前にします。
または、新規にカテゴリを追加してもOKです。
A18.png
キューを選択し、インスペクターにて「カテゴリ」をクリックします。
A19.png
カテゴリの編集ウィンドウが開くため、作成したカテゴリを適用します。
A20.png
環境音、効果音のキューそれぞれに対して、忘れずにカテゴリを設定しておきましょう。

水中で再生される効果音には一括してこのカテゴリを設定し、逆に水深の影響を受けないであろうUIなどのサウンドには別のカテゴリを設定すると良いでしょう。
また、BGMについては通常エフェクトをかけませんが、深く潜ることを印象づけたい場合などには、要所でAISACコントロールを使っても面白いかもしれません。

キューシートのビルド

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

UEでサウンドを再生・変化させる

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

ビルドしたacbファイル、acfファイルをコンテンツブラウザの任意の場所にドラッグアンドドロップしてインポートします。
B01.png
必要なキューがすべてインポートされていることを確認します。
B02.png
プロジェクト設定を開き、
B03.png
CriWareタブのAtomConfigを今回インポートしたacfファイルに設定します。
B04.png

サウンドの再生

ひとまず、通常の再生を試してみましょう。
レベル上にインポートしたキューをドラッグアンドドロップして配置します。
B05.png
環境音ではない、効果音のキューに対しては自動で再生されないようDetailsパネルにて「Auto Activate」のチェックを外します。
B06.png
レベルブループリントを開きます。
B07.png
自動で再生されないよう設定した、効果音のキューのリファレンスノードを配置します。
(レベル上でキューを選択しておき、ブループリントグラフ上で右クリック→「Create a Reference to 『キュー名』」)
B08.png
「1」キーを押したらPlayノードで再生されるようにし、ゲームを再生してテスト再生してみましょう。
B09.png

水深の取得

深さをシミュレートするために、スロープのある簡単なレベルを作成しました。
B10.png
レベルブループリントのグラフにて、新規にfloat型変数「SurfaceZ」を作成します。
C01.png
水面のメッシュのZ座標を初期値として入力します。
C02.png
Tickイベントで処理を行います。
C03.png
水深を算出するために、プレイヤーの座標を取得します。
Get Player CharacterGet Actor Locationノードを使用します。
C04.png
Get Actor Locationノードの黄色いピンを右クリックし、「Split Struct Pin」を選択すると……
C05.png
ノードのアウトプット(vector情報)が分割され、Z座標が個別で取得できるようになります。
C06.png
水面のZ座標とプレイヤーのZ座標を比較します。
C07.png
Print Stringノードで現在の差分(=水面からの距離)を文字として出力します。
Print StringノードのDurationは「0.0」としておくと、ログがたくさん出続けるのを防ぐことができます。
C08.png
画面左上に水深が出るようになりました。
しかしこれはUnit単位の表示なので、もう少し分かりやすくしてみましょう。
C09.png
1unitは1cmに相当するので、「0.01」をかけて1/100にし、さらにRoundノードで整数に変換します。
C10.png
メートル単位で水深が表示されるようになりました。
C11.png

水深に応じたサウンド変化

取得できた水深の情報を元に、サウンドを変化させていきます。
ノードを整理するため、Sequenceノードをはさみます。
C12.png
float情報に対して別の値を出力するため、Map Range Clampedノードを使用します。
水深は(unit単位で)「0.0~1400.0」とし、それに対して「0.0~1.0」の値を出力します。
これがAISACコントロールに渡す値となります。
C13.png
得られた値をSet Aisac Control by Nameノードに渡します。
カテゴリ名とAISACコントロール名も忘れずに設定します。
C14.png
ふたつのAISACコントロールの値を変化させます。
C15.png
これで浅い場所では音がクリアめに、深い場所では鈍くなる演出が実装できました!
C16.png

水中では必要に応じて、衝撃音などの再生時に泡の音を同時に再生してみるなどしてみると、臨場感が増して面白いかもしれません。

補足

AtomCraftにて、複数のグラフをひとつのAISACコントロールにまとめることも可能です。
「AISACリスト」にて、AISACコントロールを選択した状態で右クリックし、「グラフの作成」→(使用したいグラフ)を選択します。
D01.png
AISACリストにグラフが追加され、異なる種類の変化をひとつのAISACコントロールで済ませられるようになります。
D02.png
エフェクトを別々にかけたい等の用途がない場合、こうしてまとめると便利になります。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?