はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではUE5とADX for UEを連携させ、ゲーム内のスロー演出に関わるサウンドを実装する方法を紹介します。
アクションゲームのジャスト回避成功時や重い一撃の表現などで発生する、などの例がよく見られるかと思います。
スロー演出は映像だけでも成立しますが、サウンドが付随することで一気に没入感と説得力が増すでしょう。
動画では
- スロー演出突入時に「ドゥーン↓」という重いスティンガー
- スロー中に音がくぐもるエフェクト
- スロー中にループしているサウンド(雰囲気づくり)
- スローからの復帰時に「シューン↑」という軽いスティンガー + エフェクト解除
といった構成でサウンドが演出されています。
やること
- サウンドを構成する
- UEでスロー演出を発生させる
- スロー開始、終了時にサウンドを再生する
- スロー中のフィルタエフェクトをかける
また、記事中に「blueprintue」を使用したBPグラフ共有を載せています。コピペするだけで大体の実装ができますので、よろしければご活用ください。
当記事ではUE5.6 及び 「ADX LE UE SDK(2.04.02)」を使用します。
また、基本的にブループリントのみでの実装を行います。
ADX for UEはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/
前提
「ADX for UE LE」を使用します。導入や簡単な使い方は以下の記事にあります。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)
ADX for UEの導入で、一歩上のサウンド表現を(実践編)
スロー演出のサウンドを実装する
AtomCraftでサウンドを構成する
まずはADX for UEで使用するサウンドを用意するために、オーサリングツールである「AtomCraft」でサウンドを構成します。
マテリアルを用意する
まずは音素材を用意し、マテリアルとしてインポートします。
スロ演出のスタート、ループ、エンド素材です。

キューを作成する
UEから再生する単位である「キュー」を作ります。
キューシートを選択し、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択します。

今回スロー演出スタートのサウンドは2つの音素材を合成して作っているので、両方ともキュー内にドラッグ&ドロップして投げ込みます。

他のキューも同じようにして作ります。


スロー中のループサウンドは、マテリアルを選択しインスペクターの「ループ情報の上書き」を「True」、「ループタイプ」を「ループ」に設定しておくことでループ再生されます。

キューシートのビルド
他にも細かな設定などが可能ですが、ひとまずこれで一度キューシートをビルドし、UEに持っていきます。
(エフェクトをかける場合、また後でAtomCraftに戻ってきます)


UEでスロー演出を実装する
キューシートのインポート
ビルドしたacbファイル、acfファイルをコンテンツドロワーにドラッグ&ドロップしてインポートします。
その際に表示されるダイアログでは「Yes」を選択します。
これにより、プロジェクトに使用するAtom Configが自動的に設定されます。

キューシートとAtomConfigアセットが作られました。

念のため、キューシートアセットを開いてキューを再生し、音が正常に鳴るかテストしておくといいでしょう。

スロー演出管理用のアクターを作る
ゲーム内のあらゆる場面でスロー演出を呼び出せるよう、専用のアクターを作っておきます。
システム系のマネージャークラスがあるなら、そちらにこの機能を追加しても良いでしょう。
コンテンツドロワーで右クリックし、「Blueprint Class」を選択。

親クラスには「Actor」を指定します。

「BP_SlomoManager」と名前をつけました。分かりやすい名前ならなんでも大丈夫です。

ダブルクリックして開きます。
イベントグラフにスロー演出の開始、解除用のカスタムイベントを作ります。右クリックし、「Add Custom Event」です。

それぞれのカスタムイベントに「StartSlomo」「EndSlomo」と名前をつけました。
そのうち、「StartSlomo」イベントの入力ピンとして「Duration」(持続時間)を追加します。型はFloatです。

また、変数を追加します。スロー演出の残り時間を記憶しておくための変数です。
名前を「SlomoRemain」とし、型はFloatです。

スロー演出開始時に、Set SlomoRemainで指定されたスローの持続時間を「Slomo Remain」に代入します。

Set Custom Time DilationノードやSet Global Time Dilationノードを使い、実際にアクターの動きをスローにします。
前者は特定のアクターのみを、後者はゲーム全体をスローにする場合で使用します。
たとえば、「うまく回避した場合に敵の動きだけをスローにする」などのシチュエーションでは前者を使用するといいでしょう。

Set Global Time Dilationノードは演出に使用するのが良さそうです。

スロー演出の残り時間をカウントし、必要に応じて解除する処理を追加します。
Event Tickに次のような処理を書きます。
変数「SlomoRemain」の値を見て、スロー演出中であれば残り時間を減算し、0以下になればEndSlomoイベントを呼び出し解除します。

この動作をテストするため、簡易な呼び出し処理を書いてみましょう。
レベル上に「BP_SlomoManager」をドラッグ&ドロップして配置します。

「BP_SlomoManager」を選択したまま、レベルブループリントを開きます。

イベントグラフ上で右クリックし、「Create a Reference to BP_Slomomanager」を選択しリファレンスノードを呼び出します。

Input Key 1でキーボードの「1」キーの入力を検知し、「BP_SlomoManager」のStartSlomoイベントを呼び出します。
また、その際Durationでスロー演出の持続時間も指定します。

ゲームを再生すると、「1」キーを押すと対象の動きがスローになるはずです。
スロー開始・終了時のサウンドを再生する
スロー開始・解除時にそれぞれ専用のサウンド(キュー)を再生します。
サウンドを再生するにはPlay Sound 2Dノードを使用します。
次の画像のとおり、必ず「Atom」カテゴリにあるものを使用します。「Audio」カテゴリにあるものはUEデフォルトのサウンドベース、サウンドキューを再生するためのものなので、Atomキューには使用できません。

それぞれのPlay Sound 2Dノードで再生するキューを指定します。

スロー中のループサウンドを再生する
スロー演出中にだけ鳴り続けているループサウンドを再生します。
静寂感やキャラクターの集中を感じさせるようなアンビエントが適しています。
「BP_SlomoManager」にコンポーネントを追加します。
Componentパネルの「+Add」ボタンを押します。

「Atom Component」を追加します。これはAtomキューを再生したり、その場で再生し続ける場合などに使用します。

Detailsパネルで再生するキューシート、キューを指定します。

デフォルトではゲーム開始と同時に再生されるようになっているので、「Auto Activate」のチェックを外して自動再生を無効化します。

イベントグラフにAtom ComponentのGetノードを配置します。

Fade In、Fade Outノードを使ってキューをフェードイン、フェードアウトさせます。

これでひとまず、スロー演出とそれに伴うサウンド再生処理が完成しました。
次は、スローにすべての音をくぐもらせ、普段と異なる状態、加速感などをサウンド面から演出してみましょう。
スロー中のエフェクトを実装する
エフェクトをAtomCraftで構成する
AtomCraftに戻り、サウンドにかけるエフェクトを構成します。
スロー演出を作ったプロジェクトを開きます。
プロジェクトツリーの「Mixer」を選択します。
画面下部のタブから、ミキサーに切り替えます。

新たに「バス」を2つ作ります。空欄で右クリックして「バスの作成」を選択。

「BUS1」「BUS2」を作りました。

BUS2に「センド」を追加します。

「BUS1」をセンド先とするセンドを追加しました。

プロジェクトツリーのバスマップを選択し、インスペクターにてバスセンドを次の画像のように設定します。
バス名1に「BUS2」を指定します。

これにより、まずサウンドはBUS2から送られ、BUS1とMasterOutの両方に流れることになります。
BUS1にはエフェクトをかけ、BUS2とBUS1の音量を調整することにより、エフェクトのかかっていない音とエフェクトのかかった音のバランスを切り替えることで、ゲーム内でのエフェクト切り替えを実現するわけです。

BUS1へのエフェクトを追加します。エフェクトの+ボタンから特定の高さの音をカットし、音をくぐもらせる「バンドパス」を選択します。

他にもエフェクトを追加できます。例として「エコー」も追加してみました。

BUS1とBUS2の音量の状態を切り替える方法として、「スナップショット」機能があります。
これはミキサーの状態のプリセットを個別で作り、一挙に切り替えるというものです。
「Mixer_0」を選択し、右クリックして「新規オブジェクト」→「スナップショットの作成」を選択します。

2つのスナップショットを作ります。
「Snapshot_Default」「Snapshot_Slomo」としました。

スナップショットを編集していきます。
ミキサー画面の上部で編集するスナップショットを切り替えます。

各バスの下部にあるカメラのボタンから、「スナップショットに追加」を選択してスナップショットにバスの状態を追加します。ひとまずすべてのバスを追加しておきましょう。

「Snapshot_Default」「Snapshot_Slomo」について、すべて追加します。

プロジェクトツリーではスナップショットに追加されているバスが確認できます。

プロジェクトツリーで「Snapshot_Default」の「BUS2」を選択し、ミキサー画面の右側にて「MasterOut」と「BUS1」に送信する音量を設定します。
こちらはエフェクトのかかっている音が不要なので、「MasterOut」への音量はそのままで、「BUS1」への音量はカットします。

逆に「Snapshot_Slomo」側の「BUS2」では、「BUS1」へ全振りします。

エフェクトとスナップショットのテストをするには、セッションウィンドウを使います。
ツールバーの「表示」→「セッションウィンドウ」から呼び出します。

セッションウィンドウでスナップショットを切り替えながら、エフェクトのかかり方をテストしてみましょう。

調整できたら、再びキューシートをビルドします。
UEでエフェクトを切り替える
UE5のエディタに移り、ビルドしたacbファイル、acfファイルを再インポートします。
ファイルを再びドラッグ&ドロップしてもいいですし、該当するアセットを右クリックして「Reimport」を選択しても可能です。

エフェクトを適用するため、サウンドを出力するスピーカーのような役割を持つ「Atom Rack」アセットを新規に作成します。
コンテンツドロワーで右クリックし、「ADX Atom」→「Sound Renderer」→「Atom Rack」です。

「Atom Rack」アセットが作られました。名前をつけます。

ダブルクリックして開き、今回作ったエフェクトが使えるようAtom ConfigとDsp Bus Settingを指定します。
また、デフォルトで使用したいSnapshotも指定できます。
エフェクトのかかっていない状態である「Snapshot_Default」を選びました。

作成したAtom Rackをこのプロジェクトで使えるよう設定していきます。
ツールバーから「Edit」→「Project Settings」でプロジェクト設定を開きます。

「ADX Atom」にある「Master Rack」にAtom Rackアセットを指定します。

「BP_SlomoManager」を開きます。

変数を作成します。型は「Atom Rack」です。

一度コンパイルし、初期値としてAtom Rackアセットを設定します。

この変数を対象としたSet SnapshotノードでSnapshotが切り替えられます。
それぞれのSnapshot名を入れれば実装が完了します。

ここまでの「BP_SlomoManager」のグラフはここから取得できます。