LoginSignup
0
0

More than 1 year has passed since last update.

UE5+ADXで、キャラクターの「溜め行動」に応じてサウンドを変化させる

Last updated at Posted at 2023-04-27

はじめに

アンリアルエンジンとサウンドミドルウェア「ADX for UE」を連携させ、ゲーム内でキャラクターが「溜める」(チャージする)行動をとった際にチャージ用効果音が段々と変化し、その後のアクションのサウンドにも影響を与える実装方法です。

アクションゲームによくある演出ですね。
チャージしている間の無防備な瞬間の緊張感と、発射した瞬間のカタルシスを表現するのに役立つ表現です。

実装の概要はこんな感じになります。

  • 特定のボタンを長押しすると、キャラクターがチャージを開始する
  • チャージ音は最初は低い音で、溜め続ける(ボタンを押し続ける)ことで段々高く音が変化する
  • ボタンを離すとチャージが終了し、キャラクターがチャージショットを発射する
  • アクションの開始と同時にサウンドが再生され、さらにチャージ段階によって変化する

チャージ中のサウンドはAISACコントロールで操作し、チャージショットに関してはゲーム変数による「スイッチ」機能で実装します。

前提

当記事では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でチャージ音、アクション音を構成する

マテリアルのインポート

必要になるサウンドを用意し、インポートします。
今回用意したのはチャージ中に再生され続ける「SE_Charge」、そしてチャージ段階に応じた3種類のチャージショット音「SE_ShotA,B,C」です。「SE_Charge」はループできるものがいいでしょう。
A01.png
マテリアルツリーで「SE_Charge」を選択し、ループ情報の上書きを「True」、ループタイプを「ループ」にします。
これで自動的にループ再生され続けるようになります。
A02.png

チャージ用キューの構成

新規にキューを作成します。
ワークユニットツリーでキューシートを右クリックし、「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択します。
A03.png
マテリアルツリーから「SE_Charge」をドラッグアンドドロップして配置します。
テスト再生し、ループ再生されることを確認します。
A04.png
トラックリストの空欄で右クリックし、「新規オブジェクト」→「AISACの作成」を選択します。
A05.png
名前をつけ、AISACグラフタイプを「ピッチ」にします。チャージが長くなるにつれどんどん音が高く、早くなるイメージです。
A06.png
「ピッチ」のグラフを選択し、グラフを右肩上がりになるよう編集します。
A07.png
テスト再生しながらスライダーを動かし、サウンドがどのように変化するのか試してみましょう。
チャージを開始した瞬間は左端の部分が流れ、チャージ段階が最大になると右端のように再生されます。
A08.png

チャージショット用キューの構成

チャージショット用のキューを作成します。
ワークユニットツリーでキューシートを右クリックし、「新規オブジェクト」→「キュー『スイッチ』の作成」を選択します。
A09.png
キュー内に3つのサウンドをトラックを分けて入れておきます。
A09b.png

再生し分けるために「ゲーム変数」を追加します。
プロジェクトツリーで右クリックし、「新規オブジェクト」→「ゲーム変数の作成」を選択します。
A10.png
新しいゲーム変数に名前をつけます。今回は「ChargeLv」としました。
A11.png
チャージショットのキューを選択し、インスペクターにて「スイッチ」を開きます。
A12.png
スイッチ変数に新しく作成した「ChargeLv」を設定します。
A13.png
「等分化」ボタンを押し、各スイッチ幅が均等になるようにします。
A14.png
「セッションウィンドウ」でどう再生されるか確認してみましょう。
A15.png
「ゲーム変数」ボタンを押すと、テスト用のゲーム変数が編集できるようになります。
A16.png
ゲーム変数「ChargeLv」を動かし、数値によってサウンドが変化することを確認してください。
A17.png

キューシートのビルド

ここまでできたら、キューシートをビルドしてUEに持っていきます。
A18.png
A19.png

UEでサウンドを実装する

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

ビルドしたキューシートをコンテンツブラウザにドラッグアンドドロップしてインポートします。
B01.png
B02.png
プロジェクト設定を開き、
B03.png
「CriWare」タブにて「Atom Config」にインポートしたacfファイルを指定します。
B04.png

入力の登録

チャージショットアクションの入力用ボタンを登録します。
プロジェクト設定の「Input」タブに移動します。
B05.png
Axis Mappings」の+ボタンを押して新しい入力を追加します。
B06.png
今回はテスト用として、マウスの左クリックを登録しました。
B07.png

サウンドの再生

キャラクターのブループリントアクターを開きます。
B08.png
登録した入力を感知するイベントInput Axis Chargeを追加します。
C01.png
チャージ中かどうかを判別する変数、「bCharge」を追加します。型はBooleanです。
C02.png
ボタンが押されている(入力強度が0.1以上)の場合、まずキャラクターがチャージ中かどうか判別します。
C03.png
非チャージ状態であれば、「bCharge」をTrueにしてチャージ状態とします。
また、Spawn Atom Sound at Locationノードを使ってチャージ用のサウンドを再生し始めます。
C04.png
Spawn Atom Sound at Locationノードの青いアウトプットピンを右クリックし、「Promote to Variable」で変数化します。
これにより、変数化しておいたサウンドに後から用意にアクセス可能になります。
C05.png
変数化したサウンドは「ChargeSound」と名前をつけました。
C06.png
入力強度が0.1以上でない(つまりボタンを離している)側では、チャージ中であればチャージ状態を解除(False)にし、チャージサウンドをDestroy Componentして再生を停止します。
C07.png
また、その後またSpawn Atom Sound at Locationノードでチャージショットのサウンドを再生します。
C08.png
現時点でのノードの全体図はこのようになります。
C09.png

この状態で最低限の機能が実装されているので、テストしてみましょう。ボタンを押している間チャージサウンドがループし、離すと再生が停止し、その代わりにチャージショットのサウンドが再生されます。

チャージに応じたチャージ音のサウンド変化

チャージ段階によりサウンドが変化するよう実装していきます。
まずはチャージ段階を記憶しておくための変数「ChargeLv」を追加します。型はFloat型です。
D01.png
ボタンを押している間かつチャージ中である場合、チャージ段階を加算していきます。今回はGet World Delta Secondsノードを加算してるため、リアルタイムの1秒でチャージ段階が「1.0」上昇します。
D02.png
ボタンを押し続けている間チャージ段階が無限に上昇してしまうので、Clampノードを噛ませて最大値を制限します。
D03.png
Set Aisac by Nameノードを使い、キューに対してAisacコントロールを行います。値は「ChargeLv」をそのまま代入します。
D04.png
しかし、チャージ段階が「0~1.0」の間だけとは限りませんよね。チャージ段階がどの値であってもAisacコントロールには「0~1.0」の値を渡したいため、Map Range Clampedノードを使用します。
「In Range」に入力(チャージ段階の最小値と最大値)を入れ、「Out Range」にはAisacコントロールの段階の最小値と最大値を入力します。
これにより、「Return Value」からチャージ段階に応じたAisacコントロール値用の「0~1.0」の数値が出力されます。
D05.png

チャージに応じたチャージショットのサウンド変化

チャージショットのサウンドも段階的に変化させていきます。
ゲーム変数に応じたサウンドの変化はAtomCraft側で設定したるので、ここでやるべきことはSet Atom Game Variableでゲーム変数を代入してあげることだけです。
Aisacコントロールと同じようにMap Range Clampedノードで数値を丸め、ゲーム変数に渡してあげます。
D06.png
最後に、チャージショットを撃つと同時にチャージ段階の数値をリセットします。
D07.png
ノードの全体図はこんな感じです。
D08.png

これで基礎的なチャージショットのサウンドが実装できました。
実際に操作してみると、それなりにゲーム的な気持ちよさが再現できているのが分かるかと思います。

補足

チャージ中のサウンドはその場にスポーンしているため、キャラクターが移動しながらチャージ行動をとるとサウンドが置いていかれてしまいます。
スポーンしたサウンドをAttach Component To Componentノードなどでキャラクターのメッシュに追従させてあげれば、違和感なくチャージ中のサウンドも同時に移動してくれます。
E01.png

0
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
0
0