はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5(以下UE5)とサウンドミドルウェア「ADX for UE」を連携させ、一定の領域を満たし、さらに外部にも影響を与える環境音を再生します。
たとえば川のせせらぎを考えてみましょう。
川から一定の距離にプレイヤーがいた場合は常に聞こえていてほしい音です。しかし、川という広がりを持つ以上音源の長さも川に沿って存在しなければなりません。
音源を川に沿ってひとつひとつ配置していくのも手間ですし、重複して聞こえてしまうという問題もあります。
そこで、ADXの「AreaSoundVolume」機能の出番です。
AreaSoundVolumeは一定の空間の中と外で音の聞こえ方を変化させる機能です。
直近のアップデートでAreaSoundVolumeに「Portal」機能が追加され、空間上に大きさを持つ音源を再現することが可能になりました。
これらはADX for UE旧バージョンにおける、「AtomSoundVolume」機能にあたります。
当記事ではUE5.3+「ADX LE UE SDK(2.01.00)」を使用します。
また、基本的にブループリントのみでの実装を行います。
ADX for UEはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/
前提
「ADX for UE LE」を使用します。導入や簡単な使い方は以下の記事にあります。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)
https://qiita.com/SigRem/items/4250925f6d66a4fd287a
ADX for UEの導入で、一歩上のサウンド表現を(実践編)
https://qiita.com/SigRem/items/c089b71c42e898980a46
実装
AtomCraftでサウンドを用意する
UE5で再生するためのサウンド、Atom CueをAtomCraftにてビルドします。
既に必要なファイル(acb, acfファイル)を用意できている場合は次の項から参照してください。
マテリアルのインポート
AtomCraftのマテリアルツリーに素材ファイルをインポートします。
今回は環境音となる水や森の音を用意しました。
環境音は単発で鳴るわけではなく、ずっとループして欲しいものです。
各マテリアルを選択した状態で、インスペクターにて「ループタイプ」を「ループ」に設定します。
キューの作成
新規にキューを作成します。
ワークユニットツリーで右クリックし、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択します。
作成したキューに対して、タイムライン上に再生したいマテリアルをドラッグアンドドロップして配置します。
すべてのマテリアルに対して、対応するキューを作りました。
3Dサウンドの設定
環境音が3D空間上で減衰を受けるよう設定します。
キューを選択した状態で、インスペクターにて「パンのタイプ」を「3Dポジショニング」に設定します。
3Dサウンドになったことを確認するには、セッションウィンドウを使います。
ツールバーの「表示」→「セッションウィンドウ」を選択します。
セッションウィンドウが起動します。確認したいキューをセッションウィンドウにドラッグアンドドロップします。
「3Dポジショニング」ボタンを押すと、3Dサウンドの確認機能が使用できます。
「プレーヤーに3Dオブジェクトをアタッチ」にチェックを入れておきます。
緑色の領域をドラッグすると音源が移動し、サウンドの再生位置が動いた際の様子が確認できます。
少し音の動き方が過剰に感じるので修正します。
キューを選択した状態でインスペクターの「3Dポジショニング」を選択します。
下にスクロールし、「距離減衰」の「最小」を少しだけ上げておきます。
この状態をセッションウィンドウで確認すると、音の動きが少しマイルドになっているはずです。
キューシートのビルド
設定がうまくいったらキューシートをビルドします。
ここまでできたらUE5に移行します。
UE5で環境音を実装する
今回の実装例として、川、池、焚き火があるマップを用意しました。
使用アセット:
「Dreamscape: Stylized Environment Meadows - Stylized Nature Open World Fantasy」
https://www.unrealengine.com/marketplace/ja/product/dreamscape-nature-meadows
キューシートのインポート
UE5のコンテンツブラウザ(コンテンツドロワー)にビルドしたacfファイル、acbファイルをドラッグアンドドロップしてインポートします。
acfファイルインポートの際に出てくるダイアログでは「Yes」を選択します。
これにより、プロジェクトの設定が自動的に完了します。
キューシートをダブルクリックして開き、キューが再生できることを確認します。
AtomGameplayVolumeを作成
音を持つエリアを示すAtomGameplayVolumeを作成します。
アクターの配置ボタンから、「Place Actors Panel」を選択します。
「Place Actors」パネルが現れます。
「Geometry」タブにある「Box」をレベル上にドラッグアンドドロップして配置します。
「Selection Mode」から「Brush Editing」モードに切り替えます。
頂点や面の移動、Extrude(押し出し)などを使い、Box Brushを川の形に沿って変形させていきます。
川と大体同じ領域をカバーできるよう変形させます。画像では分かりやすいようにマテリアルを変更していますが、必須ではありません。
変形が完了したら後々混乱しないよう、Selection Modeにモードを戻しておきます。
変形させた「Box_Brush」を選択し、Detailsパネルの「Convert Actor」をクリックします。これはBSPブラシを形状を維持したままActorにコンバートする機能です。
「AtomGameplayVolume」を選択します。
BSPブラシがAtomGameplayVolumeに変換されました。
名前がデフォルトのブラシ名である「Box_Brush」になっているので、分かりやすいようリネームするといいでしょう。
AtomGameplayVolumeの設定
作成したAtomGameplayVolumeから環境音をが聞こえるよう設定していきます。
キューシートを開き、川の環境音をレベル上の「AtomGameplayVolume」内に配置します。
この状態でゲームをプレイすると……音源から離れると川の音は減衰してしまいます。
まずはキューを選択し、Detailsパネルの「Override Attenuation」にチェックを入れます。
これで距離減衰が個別に設定できるようになります。
「Inner Radius」を川の幅に合うくらいに調節します。
「AtomGameplayVolume」を選択し、Datailsパネルから「+Add」ボタンを押してコンポーネントを追加します。
今回の実装の要となる「Portal」コンポーネントを選択します。
「AtomGameplayVolume」に「Portal」コンポーネントが追加されました。
もうひと手間必要です。コンテンツブラウザ(コンテンツドロワー)の任意の場所で右クリックし、「ADX Atom」→「Atom Sound Class」を追加します。
「Atom Sound Class」が作られます。環境音のためのクラスを想定し、「ASC_Environment」と名前をつけました。
ダブルクリックして開きます。
Detailsパネルの「Apply Ambient Volumes」にチェックをつけます。
これでこのAtom Sound Classに設定されたサウンドは、AtomGameplayVolumeの影響を受けることになります。
キューシートを開き、キューの「Class」に作成した「ASC_Environment」を設定します。
他の環境音のキューに対しても一括でClassを設定してしまいましょう。
ゲームを再生すると、川に沿って移動してもサウンドが着いてきてくれるようになりました!
サウンドのテスト用描画は、コンソールコマンド「atom.3dVisualize.Enabled 1」で行えます。
サウンドの位置は変化しませんが、Portal内をプレイヤーの近くまで移動できるカーソルが視覚化できます。
川の中(AtomGameplayVolumeの中)に入ると、減衰のないサウンドが聞こえます。
川を辿ったり、離れたり近づいたりして確認してみましょう。
同じように池と焚き火についてもボリュームを作成します。
BSPブラシは近い形状のものを使用します。
池の場合はCylinderを配置し、
焚き火の場合はSphereを配置して、それぞれの領域をカバーしました。
(例として作ってみましたが、焚き火のようなごくごく小さい領域かつ、プレイヤーが内部に入り込んだりしないものにはこの機能は基本的に不要です)
ボリュームを変換後でも「Brush Editing Mode」に切り替えることで、ボリュームの大きさを変更可能です。
手動で実装しようとするとなかなか骨の折れるようなシチュエーションの環境音でも、AtomGameplayVolumeとPortalコンポーネントを組み合わせることでお手軽に実現できてしまいます。
フィールドの雰囲気作りにとても有用な機能ですので、ぜひ試してみてください。