はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではVRプロジェクトをセットアップし、例として音の鳴るおもちゃを作りながら、「ADX for UE」を使った基本的なサウンド再生を実装します。
キューブを振るとマラカスの音が鳴り、速く振るほどピッチが上がったり、落として衝突すると大きな音が鳴るように
当記事では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でサウンドを用意する
サウンドオーサリングツール「AtomCraft」を起動し、UE5で使うためのキューシートをビルドしていきます。
今回は衝突音である「SE_Ball」、マラカスの音である「SE_Maracas_Loop」を用意しました。
後者はループできるサウンドとなっています。
音源をマテリアルツリーにドラッグ&ドロップしてインポートします。
「SE_Maracas_Loop.wav」を選択し、インスペクターにてループ上方の上書きを「True」、ループタイプを「ループ」に設定します。
キューを作成します。キューシートを右クリックし、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択。
マテリアルをキュー内にドラッグ&ドラップして配置します。
衝突音、マラカスのループ音それぞれにキューを作ります。
VR空間上では定位のあるサウンドが特に大事です。見た目と物理的に乖離したサウンドが聞こえてくると、人によってはかなり不快な体験となってしまいます。次の設定をしっかり試しておきましょう。
キューを選択し、インスペクターにてパンタイプを「3Dポジショニング」に設定します。
聞こえ方を確認します。ツールバーから「セッションウィンドウ」を開きます。
キューシートからキューをセッションウィンドウ下部へとドラッグ&ドロップして登録します。
セッションウィンドウ上部の「3Dポジショニング」のボタンをクリックします。
「プレーヤーに3Dオブジェクトをアタッチ」にチェックを入れます。
キューを再生し、緑色の領域内をドラッグしてサウンドを移動させ、聞こえ方を確認してみましょう。
調整が必要な場合はキューを選択し、インスペクターの「3Dポジショニング」の項目から詳細な設定が可能です。
また、角度に応じたAisacコントロールなどにも対応しています。聞く人の方角によりサウンドが変化していくといったように、立体感のある環境音にも使えるでしょう。
調整できたらキューシートをビルドします。
VRテンプレートからプロジェクトを作り、ADX for UEを導入する
UE5のエディタを起動します。
この記事ではVRプロジェクトのセットアップから行います。プロジェクトが既にある場合は、次のトピックまで読み飛ばしてください。
「GAMES」カテゴリの「Virtual Reality」を選択します。
プロジェクト名を入力し、「Create」を押します。
エディタが起動します。
ADX for UE導入のため、新規にC++クラスを作成します(プラグイン導入時に必要なだけなので、コードを書く必要はありません)。
ツールバーの「Tools」→「New C++ Class」を選択します。
「None」を選択して「Next」。
そのまま「Create Class」をします。
ADX for UEのSDK内にある「Plugin」フォルダをプロジェクトのフォルダへと移動します。
プロジェクトを起動します。ダイアログが出た場合は、「Yes」を押してプロジェクトをビルドします。
キューをインポートし、鳴らしてみる
コンテンツドロワー(コンテンツブラウザ)の適当な場所にフォルダを作り、AtomCraftでビルドしたacbファイル、acfファイルをドラッグ&ドロップしてインポートします。
その際、ダイアログでは「Yes」を選択します。
2つのアセットが作られます。
正常に再生できることを確認します。
VR空間上での聞こえ方を確かめてみましょう。
「SE_Maracas」をレベル上にドラッグ&ドロップして配置します。
Outlinerパネルにて、キューを適当な「GrabActor_StaticMesh_Physics」アクターへとドラッグ&ドロップして親子付けします。
これらのキューブはVRコントローラで掴むことができるため、インタラクションのテストに便利です。
子になった「SE_Maracas」の座標を「0.0, 0.0, 0.0」にします。
子になったオブジェクトは親に対して相対的な座標を持つため、原点にしておくと親と同じ座標ということになります。
「VR Preview」を起動します。
対象のキューブからループ音が聞こえてくるはずです。手に持ったり、投げたりしてみて聞こえ方を確認します。
キューブの咆哮からサウンドが聞こえてくるでしょうか?
マラカスを作る
この音の鳴るキューブをちょっとしたおもちゃに仕上げていきます。
動的にピッチ変化をさせたいので、一度AtomCraftに戻り作業をします。
サウンドのパラメータを動的に変更できる「Aisacコントロール」の値を使い、ゲーム中のサウンド操作を行います。
マラカスのキューを選択し、トラックリストの空欄で右クリックして「新規オブジェクト」→「AISACの作成」を選択します。
AISACグラフタイプを「ピッチ」に設定し、Aisacを追加します。
右肩上がりのグラフを適当に作ります。
「ポイントリスト」タブを使うと、数値を厳密に設定できます。
再生し、上部のスライダーを動かしAisacコントロール値の上下に伴うサウンドの変化を確認します。
UE5のエディタに戻ります。変更を反映させるため、acbファイルとacfファイルを再度インポートすることを忘れないでください。
キューを子に持つキューブを選択した状態でレベルブループリントを開きます。
右クリックし、「Create a Reference to (アクター名)」を選択してリファレンスノードを作ります。
Get Velocity、Vector Lengthで現在の速度がFloat値で取得できます。
Set Volume Multiplierノードでマラカス音のボリュームを設定します。Map Range Clampedノードで速度をボリューム値に変換し、キューブが動いている間だけマラカスの音が鳴るようにします。
また、Set Aisac Control Valueを使いAisacコントロールを行います。キューブの速度が遅いときは重い音に、速く動かすと軽快な音に変化させます。
VRデバイスを被り直すのが面倒だったり、細かいイテレーションを行いたい場合、「Simulate」モードでも物理挙動を確認できます。
通常のビューポートと同じようにアクターを選択して動かすことができます。
「Simulate」モードでは物理挙動やロジックも動いているため、マラカスとなったキューブの挙動を確かめることができます。
物体がぶつかった際の衝突音を再生する
仕上げに、物理挙動によりキューブが衝突した際のサウンドを再生します。
キューブの「StaticMesh」コンポーネントを選択し、インスペクターにて「Simulation Generates Hit Events」にチェックを入れます。
物理演算により衝突した際のイベントが発火できるようになります。
この工程を行わなくてもロジックは組めますが、イベント自体が発火しないため必ずここにチェックが入っているか確認してみてください。
イベントグラフで右クリックし、「Collision」→「Add On Actor Hit」で選択中のアクターの衝突した際のイベントが配置できます。
マラカスにしたキューブと同じものを選択しているか確認しておくと安心です。
衝突した際に毎回サウンドを再生していると不自然ですので(落ちてぶつかった跡も細かいバウンドで多数の音が鳴ってしまう)、衝突の強さが一定以上のときのみ処理を行うようにBranchノードで分岐します。
Play Sound at Locationでサウンドを再生します。同名のノードがありますが、必ずAtomカテゴリのノードを使います。
Get Actor Locationでキューブの座標から音が鳴るようにします。対象は衝突元である「Self Actor」です。
キューブを放り投げると壁や床、天井にぶつかって音が鳴るようになりました。
毎回衝突音が平坦だと違和感がありますので、ピッチやボリュームをランダムに設定するとより自然な聞こえ方になるでしょう。
VRでの体験は、プレイヤーの行動にサウンドが伴うことで臨場感がぐっと上がります。少し気を使った演出をして、ゲームの中に入っているという体験を強化してみると良いかもしれません。