はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を連携させ、
環境音にひと工夫して、立体的なアンビエントサウンドを汎用的に使えるよう実装していきます。
前回公開した記事では鳥のさえずり音を立体的な空間にスポーンし、ランダムな方向から聞こえるような実装をしました。
https://qiita.com/SigRem/items/ef86c0faf71ecd2e7974
当記事ではこれに改良を加え、より多くのシチュエーションに対応できるよう使い勝手のいい機能にしていきます。
当記事ではUE4.23+「ADX2 LE v2.10.05」を使用します。基本的にブループリントのみでの実装を想定しています。
ADX2はインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx2-le/
前提
ADX2 for UE4の導入や基本的な使い方は以下の記事にあります。当記事だけでも実装はできるかと思いますが、必要に応じて参照してください。
ADX2 for UE4の導入で、一歩上のサウンド表現を(導入編)
https://qiita.com/SigRem/items/4250925f6d66a4fd287a
ADX2 for UE4の導入で、一歩上のサウンド表現を(実践編)
https://qiita.com/SigRem/items/c089b71c42e898980a46
実装
再生するサウンドを簡単に差し替え可能にする
ブループリントを書き換えなくても、レベル上で手軽に再生するサウンドを編集可能にします。
新しくアクターを作成します。
イベントグラフを開き、前回記事「」の処理をそのままコピー&ペーストします。
この時点ではほぼ同じ内容です。汎用的な音を再生したいので、カスタムイベントの名前を「PlaySound」に変更します。
それに伴い、Set Timer by Function Nameノードの「Function Name」も「PlaySound」に変えておきます。
Play Sound at Locationノードの「Sound」の青いインプットピンを右クリックし「Promote to Variable」をクリックします。
新しく変数が作られ、自動的に接続されます。適当に名前をつけておきましょう。画像では「Sound」としています。
作成した変数はMy Blueprintパネルの「Variables」内にあります。デフォルトでは右側に目が閉じているマークがあるので、クリックして目玉が開いた状態にします。
一度コンパイルしておき、DetailsパネルでデフォルトのAtom Cueを指定しておきます。
レベル上にアクターを配置し、選択した状態でDetailsパネルで再生するAtom Cueが選べるようになっています。
より多くのパラメータをカスタマイズ可能にする
パラメータを変数化しておき、多彩な鳴らし方が可能になるよう改良します。
まずは音声の再生間隔を変数化します。
Random Float in RangeのふたつのFloat型パラメータを「Promote to Variable」で変数に変化させます。
それぞれ「IntervalMin」「IntervalMax」と名前をつけ、忘れずに目玉のアイコンをクリックして開いている状態にします。
ゲーム開始時にもイベントの発生タイミングにランダム性をもたせたいので、Set Timer by Function Nameにも一連のノードをコピーします。
また、Play Sound at Locationノードの「Volume Multiplier」「Pitch Multiplier」も変数化して編集可能にしました。
再生する座標をカスタマイズ可能にする
サウンドはプレイヤーの周りのランダムな座標で再生されますが、この範囲も変更できるようにします。
Vector型の変数をふたつ作ります。「LocationVectorMin」「LocationVectorMax」と名前をつけ、公開設定にしておきます。
次のようになっている座標のランダム処理を……
次の例のように構成しなおします。ふたつの変数の要素を一度Break Vectorで分解し、Random Float in Rangeノードにつないでいます。
これで再生範囲も編集可能になりました。
変数の初期値が0になっている(再生範囲が狭すぎて再生されない)事故を防ぐため、Default Valueを設定しておきましょう。
再生する範囲(トリガー)を指定する
プレイヤーが近づくと再生が開始されるよう、再生範囲を指定できるようにします。
「Box Collision」コンポーネントを追加します。
再生範囲となるVector型変数「TriggerBoxExtent」(トリガーボックスの範囲)を作成し、公開設定にします。
「Construction Script」タブに移り、Set Box Extentノードを置きます。「Construction Script」タブはエディタ内で、レベル上に配置したアクターの変数が変更されると走る処理です。
もし「Construction Script」タブが見当たらない場合、「My Blueprint」パネルの「Construction Script」をダブルクリックすると開くことができます。
「TriggerBoxExtent」変数のDefault Valueを適当に設定しておきます。
イベントグラフに戻り、Box Collisionコンポーネントを右クリックし「Add Event」→「Add OnComponentBeginOverlap」を選択します。
ボックス内になにかが進入した際のイベントが作られます。ゲーム開始時に処理は行わなくなるので、Event BeginPlayノードの接続は解除しておきます。
プレイヤー以外がボックスに進入しても処理を行わないよう、感知したアクターがプレイヤーである(プレイヤーの同一である)ことをBranchノードで判別します。
ぼっくすから出た際のイベントも追加します。今度は「Add Event」→「Add OnComponentEndOverlap」です。
カスタムイベントのループ処理を解除するには、Clear Timer by Function Nameを使います。
レベル上でイベントの開始範囲を設定できるようになりました!「TriggerBoxExtent」変数の値を変更することで、黄色い枠線の範囲が変わるはずです。
このままではアクターを移動させた際にいちいち「Construction Script」タブの処理が走ってしまうので、変数の値を変えたときのみに処理をさせるように変更します。
アクターの「Class Settings」を開きます。
Detailsパネルにて「Run Construction Script on Drag」のチェックを外します。これだけです。