キャラクターのダッシュアクションのサウンド表現（発展編）

# はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX for UE4」を使いて、アクションゲームなどにおけるキャラクターのダッシュ表現を、サウンド方面からアプローチする記事です。

ここではキャラクターの足音と風切り音にフォーカスし、たとえば移動速度が速くなるにつれ足音が軽く、高い音に変わっていったり、ダッシュ中に限り体が風を切る音が追加されたりといった表現を使い、アクションのサウンドを差別化していきます。

この記事は以下の記事で実装した機能をベースにしています。

**キャラクターのダッシュアクションのサウンド表現（基本編）**
https://qiita.com/SigRem/private/566cf3dceaf74527aa56


# 前提

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

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

記事執筆時点のADX for UE4のSDKバージョンはv1_29です。

ADX2 for UE4の導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
ADX2 for UE4の導入で、一歩上のサウンド表現を（導入編）
https://qiita.com/SigRem/items/4250925f6d66a4fd287a
ADX2 for UE4の導入で、一歩上のサウンド表現を（実践編）
https://qiita.com/SigRem/items/c089b71c42e898980a46


# 実装

### キャラクターのダッシュを徐々に加速させる

基本編で実装したキャラクターのダッシュ機能を改善します。
ボタンを押している間だけ走る速度が上昇していき、ボタンを離すとすぐに元の速度に戻ります。
3つ新規に変数を追加します。
ダッシュしている状態を示すBool型の「bDash」、現在の速度を示すFloat型の「DashSpeed」、加速する速さを示すFloat型の「AccelSpeed」です。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0a631800-e07d-719a-3be7-83d9d94c3e52.png)
デフォルト値は「DashSpeed」が「400」、「AccelSpeed」が「100」とします。
![A01b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/22708cee-0e16-efcf-e244-01c6e1848392.png)
ボタン入力時のイベント処理を対応させます。
スピードの変化はTickイベント内で処理してしまうので、ここではボタンを押したかどうかというステータスだけを変化させます。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/be3e1c79-59cc-bf29-0a6a-bc220b1d59d0.png)
また、風切り音のボリューム変化もこの後につなげてしまいます。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/433d14f1-f25e-7cc6-29ac-8bc5db246ad0.png)

**Event Tick**に処理を書いていきます。
まずは現在ダッシュ状態かどうかを判別し……
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/842dd143-fca8-7df3-4a13-1df632ded2e6.png)
「Dash Speed」に加算を加えます。アクセルスピードを加えますが、処理速度によって加速速度に影響が出ないよう**Get World Delta Seconds**をかけます。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7b443b78-95e9-a7f3-7fac-44eaed553737.png)
ダッシュ状態がFalseの方に処理をコピペし、速度を急速に減算するためさらに「-5」をかけます。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0fbb34dc-fe71-2afc-c133-8d3b524cee74.png)
このままでは再現なく加速・減速してしまうため、**Clamp(float)**ノードで変数の最大値・最小値を制限してあげます。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b26ded06-e22f-90c1-2531-33009d8c43a0.png)
「DashSpeed」の値を移動速度に渡してあげればダッシュ処理は完成です。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c9557cb1-4944-7830-5a11-1b3ebb687d0b.png)


### 加速度に合わせて変化するサウンド

基本編で実装した足音の変化に加え、風切り音のピッチ変化も新しいダッシュ処理に合わせて実装してみましょう。
AISACコントロールに数値を渡したいので、現在どれくらい加速しているかを「0.0～1.0」の間で算出する必要があります。
変数「DashSpeed」から基本速度である「400」を引き、そこから最大速度までを割り算で出せば良さそうです。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/56857d8b-3838-5449-c168-804cf89428b3.png)
出した数値をアニメーションブループリントの変数「Dash」に渡します。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5f53d086-bacf-a244-c737-bb9248b7f698.png)
AISACコントロール自体は基本編で実装したように、アニメーションブループリント側で行ってくれるのでこれで足音に変化が起きるようになります。
**Set Aisac by Name**ノードを使い、同じ数値を風切り音のAtomComponentに対して渡せば風切り音のピッチにも速度に応じて変化がかかります。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/390037e4-f518-99d2-128a-c15c8dd67dda.png)


### 最高速状態で追加されるサウンド

ダッシュ機能の仕上げとして、最高速に達した際へのプレイヤーへのフィードバックとして、特別なサウンドを追加してみましょう。
これ以上速度が上がらないことを伝えられますし、心地よい音であればそれ自体が上手な操作をしたプレイヤーへの報酬となりえるでしょう。

まずはAtomCraftでサウンドを追加します。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f69c257b-9827-ccb2-f8e9-390b970a1f14.png)
今回は「キーン」という高い音をマテリアルとして加えました。
通常の風切り音と同じように、ループするようインスペクターにて設定しておきます。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/60de159a-e5f8-daa4-1137-7c522552d491.png)
風切り音のキューに、新しいトラックとして追加します。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ea0179fc-00d9-e7a3-856a-0909b53084a4.png)
ISACコントロールを追加します。
![B03b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b8effcc0-f890-aff4-2794-385420b721c0.png)
基本的な実装と同じように、「ダッシュ値」用のISACコントロールIDを流用します。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/38a2810f-4a91-3c28-b7e1-a49f5eaf09d7.png)
グラフは最高速付近で急速に上昇する形にします。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/68e4f8d0-26c2-391b-4288-c107e26b1e4b.png)
加速中は単純にピッチが上がっていくだけですが、最高速が近くなると新しいサウンドが聞こえだすようになります。
音が重なってしまったり、音割れが気になる場合は通常の風切り音のトラックにもAISACコントロールを追加し、新しい風切り音と入れ替わりにフェードアウトするようにグラフを編集してみましょう。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2526cc97-403d-e4b9-fbcd-08b1e97549f0.png)
ここまでできたら再度キューシートを書き出します。

UEに移動し、再度キューシートをインポートすると、処理を変えずともダッシュの音が変化するようになっているはずです。

このように、AtomCraftでサウンドを編集することでUE側で新しいプログラムを書かなくとも音に変化を与えることができます。用途や担当に合わせて使い分けていくと便利かもしれません。