はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を使って、UE4の「シーケンサー」と連携して、サウンドを変化させる基本テクニック&プチ応用を扱います。
当記事ではUE4.26.1を使用します。基本的にブループリントのみでの実装を想定しています。
ADX2はインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx2-le/
記事執筆時点のADX2 for UE4のSDKバージョンはv1_29です。
前提
ADX2 for UE4の導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
ADX2 for UE4の導入で、一歩上のサウンド表現を(導入編)
https://qiita.com/SigRem/items/4250925f6d66a4fd287a
ADX2 for UE4の導入で、一歩上のサウンド表現を(実践編)
https://qiita.com/SigRem/items/c089b71c42e898980a46
シーケンサーについて
シーケンサーはUE4に標準搭載されている機能で、タイムライン上でキーを打ち、オブジェクトの座標やパラメータなどを変動させることで一連の決まった動きを作るものです。
一般的にはゲームのカットシーンやギミック、または映像制作に使用されます。
実装
今回は実装例として、環境音をAtomCraftで構成し、UE4に持っていき制御してみます。
AtomCraftで環境音を構成する
マテリアルの用意
風の音、雨の音になる2種類の音源を用意しました。
ドラッグアンドドロップでマテリアルツリーにインポートします。
ふたつの音源を選択し、インスペクターにてループ情報の上書きを「True」に、ループタイプを「ループ」にします。
キューの作成
新規にキューを作成します。
キューシートを右クリックし、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択します。
キュー内に2種類の音源をドラッグアンドドロップします。
AISACの作成
風の音のトラックを選択した状態で、右クリックして「新規オブジェクト」→「AISACの作成」を選択。
ウィンドウが開くので、次のように設定します。
AISACタブが開きます。
画面下からタブを切り替え、タイムラインに戻ります。
雨の音のトラックを選択し、右クリックして同じようにAISACを作成します。設定項目は同じです。
AISACタブで、トラックごとにグラフを編集します。
風のトラックはAisacControlの数値が1に近づくほど低めに、雨のトラックは0から1に上がっていくようにします。
再生しながら、上部のスライダーを動かしてテストします。数値を上げると、風の音が控えめになっていき雨の音が聞こえだす状態が理想です。
今度は屋内に入った際の音の変化をするためのAISACを作成します。
タイムラインタブに戻り、今度はトラックを選択せずに空欄でAISACを作成します。
次のように設定します。音をくぐもらせたいので、グラフタイプは「バンドパス - Cof高域」を選択します。
AisacControl_01の数値が1に近づくほど紫のグラフが低めになるよう編集します。
こちらも上部のスライダーを動かして、テストしながら設定するといいでしょう。
スライダーが右にいくほど屋内に入り、雨音がくぐもった状態になるといい感じです。
別バリエーションによる遷移キュー
別の音の遷移を試すため、異なるタイプのキューも作ってみましょう。
「セレクターによるトラック遷移」のキューを作成します。
同じようにタイムライン上にマテリアルを配置します。
プロジェクトツリーにて、「セレクターフォルダ」を選択し右クリックして、「新規オブジェクト」→「セレクターの作成」を選択します。
セレクターフォルダが作られます。環境音用なので、「Selector_Amb」と名前をつけました。
さらに、作成したセレクターフォルダの中にセレクターラベルを作成します。風用、雨用をそれぞれ作ります。
トラック名の下でセレクターラベルが選択できます。それぞれ合うものを設定しておきます。
キューのインスペクターにて、遷移時間が設定できます。ミリ秒単位で指定します。
遷移を実行するために、トラックリストの空欄で右クリックして「新規オブジェクト」→「ビート同期情報の作成」でBeatSyncマーカーを作っておきます。
再生しながら、プロジェクトツリーのセレクターラベルをクリックするとトラックが遷移します。
キューシートのビルド
ここからUE4での実装に移ります。
シーケンサーでAtom Soundを扱う
音声のセットアップ
まずはビルドしたキューシートをインポートしましょう。
acfファイル、acbファイルをコンテンツブラウザにドラッグアンドドロップしてインポートします。
プロジェクト設定を開きます。
「CriWare」タブの「Atom Config」にacfファイルをセットします。
レベル上にドラッグアンドドロップして配置します。
この時点でゲームを再生すると、風の音が流れることを確認しておくといいでしょう。
シーケンサーで音声を再生する
配置したAtom Soundをシーケンサーから制御したいので、自動再生を無効化しておきます。
Atom Soundを選択し、Detailsパネルで「Auto Activate」のチェックを外せばOKです。
レベルシーケンスを作成します。
上部の「Cinematics」から、「Add Level Sequence」をクリックします。
適当な場所にシーケンスを保存します。
シーケンサーのエディタが開きます。
画像では1画面におさめていますが、領域が大きくなるので別画面があればそちらに表示するのがいいでしょう。
レベル上でAtom Soundを選択した状態で、「+Track」ボタン→「Actor To Sequencer」→「Add(Atom Sound名)」で音源をシーケンサーに登録します。
これでシーケンサー上で音声の制御ができるようになります。
追加されたトラックの「+Track」を押し、「Atom」から再生したいAtom Cueを選択します。
これで目的の波形が配置されます。
下部の再生ボタンを押すと風の音が流れてくるはずです。
ゲーム中でレベルシーケンスを再生するには、シーケンスを選択してDetailsパネルで「Auto Play」にチェックを入れます。
その下にある「Loop」を変更するとループ再生が可能です。
任意のタイミングで再生するには、レベルブループリントから制御するといいでしょう。
レベルブループリントを開き、
レベル上でシーケンスを選択した状態で、イベントグラフの空欄で右クリックし「Create a Reference to (シーケンス名)」を選択します。
**「Play(SequencePlayer)」**を選択します。
再生用のノードが作られるので、任意のイベントにつなげば再生が開始されます。
シーケンサーからAisacコントロールを制御する
タイムライン上でAisacの値を制御し、雨を降らせてみましょう。
まずは表示時間の単位をフレーム数から秒数に変更します。
Atomトラックの表示を展開します。ボリュームやピッチ、そしてAtomCraftで設定していればAisacコントロールのトラックが出てきます。
数値を変更するか、キーフレーム追加ボタンを押すとタイムライン上にキーが追加され、値の変動が起きます。
1秒の時点で「0」、3秒の時点で「1」に変動するようキーを打ってみましょう。
再生ボタンを押すと風の音に雨の音が混じっていく様子が確認できます。
カーブエディタを上部のボタンから起動できます。
トラックを選択すると、値が変化していく様子をグラフで見ることができます。
この状態での編集も可能です。
また、同じように「AisacControl_01」も変化させてみました。段々と屋内に入っていくように雨音がくぐもっていきます。
ブループリントと連携しイベントを発火する
セレクタラベルなどの機能はシーケンサーだけでは完全にアクセスすることができません。ですが、ブループリントと連携することで処理を完成させることができます。
いくつか方法はありますが、専用のアクターを作ってしまうのが楽なので新規に作成します。
適当な場所でブループリントクラスを作ります。
親クラスはActorにします。
アクターを開き、イベントグラフに次のような処理を書きます。
グローバルなラベルを交互に変更するカスタムイベントです。
アクターをレベルに配置します。
レベルシーケンスを作り、先程のアクターをトラックに追加します。
「+Track」から「Atom」→セレクター遷移を使用したAtom Cueを選択します。
さらに、アクターのトラックにEvent Track(Trigger)を追加します。
このトラックで任意のイベントを発火させることができます。
適当な時間でキーを打ちます。
キーを右クリックし、「Properties」からイベントを選択します。
「Quick Bind」から検索して先ほどアクター内に作成したカスタムイベントを選択します。
シーケンサーからイベントを呼び出す「SequenceDirector」が作られ、開きますが特に変更の必要はないのでそのまま閉じて大丈夫です。
イベントのキーのプロパティから「Call in Editor」にチェックを入れます。
これで再生すると、キーを打ってイベントを呼び出すたびに風の音、雨の音が交互に遷移するようになります。
もちろんランタイムでも同じように動作します。