はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5とサウンドミドルウェア「ADX for UE」を連携させ、キャラクターのボイス主導でつくる「間」や息遣いなど、そのキャラクターが生きている感を演出するテクニックを紹介します。
たとえばこんなシチュエーションが考えられます。
- キャラクターがべらべらとウンチクを喋り続けているが、プレイヤーは途中から決定ボタンでスキップできる(聞き流せる)ようになる
- キャラクター同士が口論になり、台詞の間に別の台詞が割り込んでくる
- 静かなシーンで、キャラクターの台詞の合間に息遣いが再生される
- 戦闘シーンなどで、キャラクターの台詞の合間で息を切らせたり舌打ちが再生される
当記事ではUE5.5+「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の導入で、一歩上のサウンド表現を(導入編)
ADX for UEの導入で、一歩上のサウンド表現を(実践編)
実装
AtomCraftでマーカーを設定する
まずはサウンドオーサリングツール、AtomCraftで「マーカー」と呼ばれる、台詞の合間のタイミングを埋め込んでいきます。
キューの作成
マテリアル(音源)として、静かなシーンでのブレス音(CV_A_BreathA)、及び戦闘中などの激しいシーンでの息切れの音(CV_A_BreathB)をそれぞれ2つずつ用意しました。
それぞれがランダムで再生されるよう、キューを新規に作成します。
キューシートを右クリックし、「新規オブジェクト」→「キュー『ランダムノーリピート』の作成」を選択します。
「ランダムノーリピート」のキューでは、ランダム再生かつ連続して同じトラックが再生されないようになっています。
該当する種別のブレス音をドラッグ&ドロップし、それぞれ別トラックとして配置します。
「CV_A_BreathB」についても同じように行います。
マーカーの設定
トラックリストの空欄で右クリックし、「マーカーの作成」を選択します。
タイプはUE側でタイミングを検知できる「コールバック」にし、タグを「BreathA」とします。
ピンク色のマーカーが配置されました。ドラッグで再生位置を移動できます。
台詞によっては複数個所にブレスタイミングが欲しいこともあるかもしれません。
そんなときは、マーカーを右クリックして「複製」ができます。
複製したマーカーをドラッグして任意の位置に移動させます。
インスペクターで細かいタイミングを指定することも可能です。
異なるシチュエーションに対応したい場合は、タグを別のものにしてみましょう。今回は「BreathB」としました。
これらのタグにより、UE側で別のサウンドを再生したり、異なる処理を行ったりできます。
こちらもタイミングを調整します。
キューシートのビルド
UE5で台詞に演出を盛り込む
キューシートのインポート
ビルドしたacbファイル、acfファイルをコンテンツドロワー(コンテンツブラウザ)にインポートします。
acfファイルのインポート時に出てくるダイアログでは「Yes」を選択します。
これにより、プロジェクトにAtom Configが適用されます。
正常に再生できることを確認します。
キューのマーカーを検知し、イベントをトリガーする
ブレス音を再生するためのAtomコンポーネントを追加します。
今回はキャラクターボイスを再生するブループリントアクター「BP_TalkManager」に追加しています。
こちらは以前の記事UE5 + ADXで作る、ノベルゲームのサウンドテクニック(基本編)で作ったものと同じものです。
マーカーを検知するイベントを登録します。処理のタイミングはEvent Begin Playから続きます。
ボイス再生用のAtomコンポーネントのGetノードを配置し、そこから線を伸ばしてAssign On Atom Sound Cue Sequencer Eventノードを配置します。
新しくイベントノードが作られます。
Set Soundで任意のブレス音のキューを指定し、Playで再生します。
正常に処理が行われているか確認するため、Print Stringでデバッグメッセージを表示します。
台詞の合間にブレス音が再生され、デバッグメッセージが表示されました。
マーカーのタグによって処理を分岐させる
AtomCraftでマーカーに設定したタグを見て、処理を分岐させていきます。
イベントノードのアウトプットピン「Event Info」からBreak Atom Sequencer Event Infoノードで情報を分解し、取り出せます。
Switch on StringでタグのStringによって分岐します。
タグが「BreathA」か、「BreathB」かで異なるキューをSet Soundノードで設定し、再生します。
これにより、静かなシーンでは穏やかな息遣いに、戦闘シーンでは激しい息遣いといったように異なるサウンドが再生できます。
ブレスと台詞が被るのを防ぐ
音声の間のとり方やブレス音の長さ次第では、通常の台詞に被って再生されてしまうこともあります。
それを防ぐよう、ブレス音再生中は通常台詞の再生を一時停止するようにしてみましょう。
まずはブレス音再生中は通常台詞のAtomコンポーネントをSet Pausedノードで一時停止します。
ブレス音のコンポーネントのGetノードから線を伸ばし、Assign On Atom Sound Play State Changedで再生状態の変化を検知開始します。
再生状態が変化した際のイベントが作られます。
「Play State」を照合し、「Stopeed」(再生終了状態)かを判定します。
その場合、イベントの検知を完了とし、また通常台詞の再生を再開します。
これで、より自然に息継ぎや台詞の間が生まれるようになりました。
キャラクターボイスに一工夫加え、半プロシージャルな台詞の再生演出をおこなってみました
用意するボイスデータにも一工夫が必要ですが、より生き生きとした、リアリティのあるキャラクター造形を実現することができるでしょう。