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?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-27

はじめに

アンリアルエンジンとサウンドミドルウェア「ADX for UE」を連携させ、キャラクターボイスに距離に応じたエフェクトをかける実装方法です。
シングルプレイのゲームにおけるNPCの台詞や、マルチプレイのゲームにおけるラジオチャットなど、ゲームにおいてキャラクターが声を発する場面において、

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

といった演出を実現します。

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

前提

当記事ではUE5.0を使用しています。基本的にブループリントのみでの実装を想定します。
ADXはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/

なお、ADX2は「ADX」へ名称が変更になりましたが、ツール構成は変更ありません(2がないから古いほう、というわけではありません)。

記事執筆時点のADX for UEのSDKバージョンはADX LE UE SDK(1.31.00.01)です。

ADX for UEの導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
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」以上にしておきます。
A10.png
グローバルAISACはキューにドラッグ&ドロップすることで「リンク」され、プレビューなどが機能するようになります。
A11.png
リンクした状態でキューを再生し、AISACコントロールのスライダーを操作するとエフェクトがかかり、音がくぐもって聞こえるはずです。
A12.png

Aisacコントロールの「デフォルトコントロール値」にチェックをつけておきます。
A15.png

キューシートのビルド

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

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

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

ビルドしたacbファイル、acfファイルをコンテンツブラウザにインポートします。
B01.png
B02.png
プロジェクト設定を開き、
B03.png
CriWareタブのAtomConfigにインポートしたacfファイルを設定します。
B04.png

テスト用のキャラクターをレベル上に配置します。
B05.png
場所が分かればいいので、アニメーションするスケルタルメッシュを置けばOKです。
B06.png

ボイス用BPを用意する

ボイスを再生するための簡単なブループリントアクターを作成します。
コンテンツブラウザを右クリックし、「Blueprint Class」を選択します。
B07.png
親クラスは「Actor」にします。
B08.png
アクターを開き、Atomコンポーネントを追加します。
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」としました。
    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」の数値のスケールに置き換えた値が返されます。

C17.png
この値をSet Aisac Control by Nameノードの「Value」につなげれば距離に応じたAisacコントロール値が得られます

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

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?