はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではUE5とADX for UEを連携させ、マーカーとAisacコントロール機能を使用し、ループが絡むサウンド操作を実装します。
「駆動開始する音」、「駆動中の音(ループ)」、「駆動停止する音」の3要素に分解し、順番に再生していきます。
また、駆動中のサウンドは速度などによって音色が変化していく実装も行います。
使用例として、
- エレベーターの駆動音
- 乗り物のエンジン音
- サイレン
などが想定されます。人工的な音全般で使えるテクニックになります。
やること
- AtomCraftで駆動音を構成する
- AtomCraftでマーカーやAisacコントロールを設定する
- サンプルとして、UE内で簡易なエレベーターを作成する
- Blueprintでサウンドを再生する
- Blueprintでサウンドを操作する
また、記事中に「blueprintue」を使用したBPグラフ共有を載せています。コピペすることで大体の実装ができますので、よろしければご活用ください。
当記事ではUE5.7 及び 「ADX LE UE SDK(2.05.01)」を使用します。
また、基本的にブループリントのみでの実装を行います。
ADX for UEはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/
前提
「ADX for UE LE」を使用します。導入や簡単な使い方は以下の記事にあります。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)
ADX for UEの導入で、一歩上のサウンド表現を(実践編)
ADX for UEでつくる、エリアごとの音響
AtomCraftでサウンドを構成する
まずはサウンドオーサリングツール「AtomCraft」でサウンドを構成していきます。
キューの作成
「駆動開始する音」、「駆動中の音」、「駆動停止する音」を用意しました。
すべてマテリアルツリーにインポートします。
駆動中の音はループさせますが、マーカー機能を使用してループさせるので今回はここで設定する必要はありません。

キューシートを右クリックし、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択します。

このキューは駆動開始、駆動中のサウンドを連続して再生します。

キュー内に対応するマテリアルを続けて配置します。

駆動停止の音には専用のキューを作り、配置します。

マーカーの配置
駆動開始、駆動中のサウンドのキューを開き、トラックリストの空欄で右クリックして「マーカーの作成」を選択します。

これはキュー内の任意のタイミングに「マーカー」を配置し、様々な処理を行うものです。
タイプは「シーケンスループ」を選択します。

ループの両端がマーカーとして配置されるので、ドラッグして移動させます。
駆動音のループ期間を指定します。

再生ボタンを押し、正常にループされるか確認してみましょう。

Aisacコントロールの設定
Aisacコントロールを追加します。
今回は駆動する速度が速くなるほどピッチが高くなり、機械が激しく動いている様子を演出します。
AISAC名を設定し、AISACグラフタイプを「ピッチ」にします。

AISACタブに切り替えます。

グラフを編集します。
右側の「ポイントリスト」で数値を設定してもOKです。

キューシートのビルド
UE5でサウンドを実装する
ここからはUEのエディタを使用します。
キューシートのインポート
エクスポートしたacbファイル、acfファイルをコンテンツドロワーにドラッグ&ドロップしてインポートします。
その際に表示されるダイアログでは「Yes」を選択します。
これにより、プロジェクトにAtomConfigが設定されます。

コンテンツドロワーにアセットが作られます。

キューシートアセットを開き、再生されることを確認しておきましょう。

簡易なエレベーターを作成する
移動するエレベーターを用意します。ロジックで動かしてもいいですし、シーケンサーで動作を決め打ちしてしまう方法もあります。
今回の実装例ではシーケンサーで稼働させます。
メッシュが上下に移動するだけのタイムラインを用意しました。

シーケンサーを使う上での注意点として、再生終了時の挙動を設定しておくことをおすすめします。
「Transform」トラックを右クリックし、「Edit Section」→「When Finished」を「Keep State」に設定します。デフォルト設定では再生終了後、メッシュが元の位置に戻ってしまう挙動をすることがあります。それを防ぐための手法です。

レベルシーケンスを選択した状態で、レベルブループリントを開きます。

キーを押したらレベルシーケンスが再生され、エレベーターが動き出すような処理を作っていきます。
まずはInput Keyノードを配置します。
エレベーターを上下させるため、「1」キーと「2」キーのノードを作りました。

右クリックし、レベルシーケンスのリファレンスノードを配置します。

それぞれ、Playノードと逆再生させるPlay Reverseノードを配置して繋げます。

テストしてみましょう。簡素な見た目ですが、最低限エレベーターの昇降になっていると思います。

Blueprintでサウンドを再生する
レベルにキューを配置します。
「ADX」→「Atom Ambient Sound」を選択。

このキューはエレベーターに追従させて再生したいので、OutlinerパネルでAtom Ambient Soundをドラッグ&ドロップしてエレベーターのメッシュ(BPアクターでも可)の子にします。

Outlinerパネル上ではこのような表示になっていればOKです。

Detailsパネルで再生するキューを指定します。エレベーターの再生開始・ループ音のキューです。

ゲーム開始時に自動で再生されないように、「Auto Activate」のチェックを外しておきます。

レベルシーケンスの再生と共に、AtomAmbientSoundもPlayで再生します。

Bind Event to On Atom Sound Finishedノードを配置します。

これはキューの再生終了を検知できるノードで、それをトリガーにして別のイベントを発火できます。

赤いアウトプットピンから線を伸ばし、カスタムイベントを追加します。

カスタムイベントの内容はこんな感じです。
Fade Outノードで駆動音を止め、Play Sound at Locationでエレベーターのキュー位置で停止音を再生します。

エレベーターが動き出すとサウンドが再生され、駆動中はループします。
エレベーターが止まるとループサウンドが停止され、エレベーターの停止音が再生されます。

Blueprintでサウンドを操作する
BlueprintからAisacコントロールを操作し、駆動中のサウンドを変化させます。
エレベーターが駆動中であることを判別するBool型変数「bElevatorMove」を追加します。

エレベーターの駆動開始・終了時に変数をSetします。

Event Tickから、エレベーターが駆動中であればSet Aisac Control ValueでAisacコントロールを実行します。

操作対象のAisacコントロールを指定します。群青のアウトプットピンを右クリックし、「Promote to Variable」で変数化します。

コンパイルし、初期値を指定します。AtomCraftでカーブを作ったAisacコントロールを選択します。

エレベーターの速度を取得し、Aisacコントロールの値に変換します。
まずはGet Velocityで速度を取得します。
Vector Lengthノードで線形の速度を得ることができます。
この方法なら上下方向の移動だけでなく、斜めに移動するエレベーターや横方向に移動するリフトなどの足場にも応用可能です。

Map Range Clampedで、速度の基準を設定した上でAisacコントロールに渡す「0.0~1.0」の値に変換します。
この例では「0~500ユニット」の速度を「0.0~1.0」に変換しています。
Map Range Clampedノードなら、「Out Range A」と「Out Range B」が上限値と下限値になるため想定外の数値が渡されないので安全です。

これで、エレベーターの速度に応じて駆動音が変化するようになりました。
ここまでのノードはこちらからコピペできます。
今回の実装テクニックはエレベーターに限らず、車の駆動音、電車や搬送機、工業用の機械装置など、速度に応じて音が変化するもの全般に応用できます。
ただ音を鳴らすだけでなく、動きに合わせて少し変化させたいときのちょっとした演出として使い回せるでしょう。





