1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ADX+UE5で、キャラクターボイスに距離に応じたエフェクトをかける

Last updated at Posted at 2023-03-27

はじめに

ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5とサウンドミドルウェア「ADX for UE」を連携させ、ゲーム中のキャラクターボイスなどに距離に応じたエフェクトをかける実装方法を紹介します。

シングルプレイのゲームにおけるNPCの台詞や、マルチプレイのゲームにおけるラジオチャットなど、ゲームにおいてキャラクターが声を発する場面において、

  • 近距離では普通に声が聞こえる
  • 遠距離では無線通信のように声が聞こえ、ノイズが乗る
  • さらに距離が離れると声がくぐもっていき、聞こえづらくなる

といった演出を実現します。
3つめの要素を省けば、ゲームのレベル上のどこにいてもキャラクター同士が通信可能なシチュエーションができあがるでしょう。

当記事では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を使い、キャラクターボイスとノイズのサウンドを登録します。

マテリアルのインポート

マテリアル(音声素材)をインポートします。
次の画像では、キャラクターボイスとノイズでマテリアルフォルダーを分別しています。
A01.png

キューの作成

インポートしたマテリアルをキューシートにドラッグ&ドロップし、そのままキューを作成します。
A02.png

それぞれのマテリアルについてキューを作成します。
ここも必要に応じてキューシートを分けても構いません。
A03.png

ノイズは無線通信中常に再生しておきたいので、マテリアルを選択した状態でインスペクターにて、ループ情報の上書きを「True」、ループタイプを「ループ」に設定しておきます。
A04.png

カテゴリの作成

ゲーム中では声がくぐもるエフェクトをキャラクターボイスのみにかけたいので、「カテゴリ」機能を使用します。
プロジェクトツリーの「カテゴリ」を展開し、任意のカテゴリグループを右クリックし「新規オブジェクト→カテゴリの作成」を選択します。
A05.png

「Voice」という名前のカテゴリを作成しました。
A06.png

キャラクターボイスのキューを選択し、インスペクターのカテゴリ編集ボタンを押します。
A07.png

「Voice」にチェックをつけてOKボタンを押します。
すべてのキャラクターボイスのキューに対してこの操作を行います。
A07b.png

Aisacコントロールの設定

エフェクトをかけるため「Aisacコントロール」機能を使用します。
複数のキューにAisacコントロールを適用するため、「グローバルAISAC」を作成します。
プロジェクトツリーの「グローバルAISAC」を右クリックし、「新規オブジェクト」→「AISACの作成」を選択します。
A08.png

AISACグラフタイプを「バンドパス - Cof高域」を選択します。高域をカットして音声をくぐもらせる効果があります。
A09.png

線形のシンプルなグラフを作成します。AISAC値は最小でも「0.1」以上にしておきます。
0.0に近い数値にすると、エフェクトがかかりすぎてほぼ聞こえなくなってしまいます。
A10.png

グローバルAISACはキューにドラッグ&ドロップすることで「リンク」され、プレビューなどが機能するようになります。
キャラクターボイスとなるすべてのキューに対してリンクを行います。
A11.png

リンクした状態でキューを再生し、AISACコントロールのスライダーを操作するとエフェクトがかかり、音がくぐもって聞こえるはずです。
A12.png

Aisacコントロールの「デフォルトコントロール値」にチェックをつけておきます。
これにより、デフォルトの値を0.0に固定します。
A15.png

キューシートのビルド

ここまでできたらキューシートをビルドします。
A13.png
A14.png

UE5でボイス演出を実装する

キューシートのインポート

ビルドしたacbファイル、acfファイルをコンテンツドロワー(コンテンツブラウザ)にインポートします。
acfファイルのインポート時に出てくるダイアログでは「Yes」を選択します。
これにより、プロジェクトにAtom Configが適用されます。
B01.png

キューシートが正常にインポートされたことを確認します。
B02.png
B03.png

テスト用のキャラクターをレベル上に配置します。
B05.png

場所が分かればいいので、アニメーションするスケルタルメッシュを置けばOKです。
B06.png

ボイス用BPを用意する

ボイスを再生するための簡単なブループリントアクターを作成します。
コンテンツブラウザを右クリックし、「Blueprint Class」を選択します。
B07.png

親クラスは「Actor」にします。
B08.png

アクターを開き、Atomコンポーネントを追加します。
B13.png

B08b.png

再生するサウンドを指定します。
これはテスト用の初期値として、実際はランタイムでサウンドを指定して喋らせていくといいでしょう。
B09.png

テスト用に、DetailsパネルでLoop Settingsを「Loop」に設定します。
B10.png

アクターをレベルに配置し、キャラクターの口元に移動させます。
B11.png

ゲームを再生し、聞こえ方を確認します。
B12.png

ボイスの距離減衰を設定する

距離減衰用の設定データを作成します。
コンテンツブラウザを右クリックし、「Sounds」→「Sound Attenuation」を選択します。
C01.png

用途に応じて作っておくといいでしょう。距離減衰が適用されればいいので、今回は特に設定をいじりません。
C02.png

AtomコンポーネントのAttenuation Settingsに作成したファイルを指定します。
C05.png

キャラクターの周りを移動したりカメラを動かすと、距離減衰がかかっているのがわかると思います。
C06.png

一定距離以上離れた場合にノイズをかける

キャラクター同士の距離を監視し、一定距離以上離れた際にモードを切り替えノイズ音を同時に再生します。
ノイズ用のAtomコンポーネントを追加します。
C07pre_a.png

ノイズ音のキューを指定します。
C07pre_b.png

自動的に再生されないよう、「Auto Activate」のチェックをオフにしておきます。
C07pre_c.png

イベントグラフに移動し、変数を追加します。

  • bVoiceEffect」: Bool型です。エフェクトをかける(=一定以上離れたモード)かどうかを判別します。
  • ThresholdDistance」: Float型です。どれくらい距離が離れたらエフェクトをかけるかの値です。
    C07.png

コンパイルし、「ThresholdDistance」の初期値を指定します。ここでは「1000」としました。
「1000」ユニットを想定しています(およそ10メートル)。
C08.png

Event Tickから処理を開始します。
まずはエフェクトをかけているかどうかで距離を分岐します。
C09.png

「False」側ではまず、距離が一定以上離れているかを判別します。
C10.png

離れていれば「bVoiceEffect」をTrueにし、ノイズ音を再生します。
C11.png

「bVoiceEffect」がTrueの場合は逆に距離が近いかどうかを判別します。
C12.png

近ければ「bVoiceEffect」をFalseにし、ノイズ音を停止します。
C13.png

イベントグラフの全体図はこんな感じです。
C13b.png

この状態でゲームを再生し、キャラクター同士が離れると声にノイズがかかり、近づくとノイズが止みます。

距離に応じて声にエフェクトをかける

Aisacコントロールを使用し、距離が離れるごとに徐々に声が聞こえづらくなる実装をしていきます。
「VoiceEffect」がTrue、つまりキャラクター同士が離れている状態で、BranchノードがFalse、つまり距離が離れているままの場合Set Aisac Control by Nameノードを使用してAisacコントロールを行います。
C14.png

距離を取得し、「距離が10000ユニット以上離れるとエフェクトが最大になる」ようにします。
「距離1000~10000ユニット」を「Aisacコントロール値0.0~1.0」に変換するのに有用なのがMap Range Clampedノードです。
「Value」に代入された値を「In RangeA~B」から「Out RangeA~B」の数値のスケールに置き換えた値が返されます。
この値をSet Aisac Control by Nameノードの「Value」につなげれば、距離に応じたAisacコントロール値が得られます。
C15.png

これで大丈夫そうですが、念のため近づく(ノイズを再生停止する)ときに声のエフェクトのAisacコントロール値を「0.0」に戻しておきます。
今回はAisacコントロール値を「0.0~1.0」の間で変動させていますが、最小値が異なる場合はこうして値をリセットしてあげるのがベターです。
C16.png

キャラクターのボイスがどこにいても距離減衰なく聞こえる場合、ゲーム的な都合ですが違和感を覚えてしまうことがあります。軽い演出を加えれば「このキャラクターは通信手段があるんだな」という理由付けができ、違和感を解消できるでしょう。ゲーム性や設定に応じて調整し、実装してみてください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?