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

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

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


# 前提

当記事では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


# 実装

## AtomCraftでサウンドをデザインする

### マテリアルの用意
サウンドオーサリングツール「AtomCraft」で足音と風切り音のサウンドを作っていきます。
今回は次のようなマテリアル（音源）を用意しインポートしました。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4c2c2134-d380-4cbf-c2d2-69dfdb313ea5.png)
歩行時の足音、ダッシュ時の足音、風切り音の3つです。風切り音だけはループ素材を想定しています。



### 足音を作る

足音となるキューを作成します。
ワークユニットツリーのキューシートを右クリックし、「新規オブジェクト」→「キュー『ポリフォニック』の作成」です。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d680af84-8a55-fce4-437a-36ed00f14627.png)
作成されたキューに名前をつけます。ここでは「Cue_Act_Locomotion」としました。
トラックリストに歩行時とダッシュ時の足音のマテリアルをドラッグ・アンド・ドロップで配置します。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3e5f37f7-9b81-aedf-25f7-8765867d4232.png)
**歩行時のトラックを選択し**、右クリックして「新規オブジェクト」→「AISACの作成」を選択します。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/509d1715-ce6c-cdde-551b-fa128d7fac03.png)
AISACの追加ウィンドウが出現するので、「Aisac_Act_Dash」とでも名前をつけておきましょう。
今回はAISACコントロールのIDは一貫して0番を使用します。これにより、ダッシュのパラメータひとつですべてのサウンドの変化が実現できるためです。
AISACグラフタイプは「ボリューム」のままでOKです。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/af62ed32-59e8-e8ec-10ed-edf8d7cff472.png)
「AISACリスト」の「ボリューム」を選択してグラフを編集します。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6b4ac48f-96cd-496c-a530-e646564f5a5c.png)

「ダッシュ値」（移動速度）が上がるほど足音が歩行時からダッシュ時のものに切り替わってほしいため、グラフを右肩下がりにします。ダッシュ値が上がれば歩行時のサウンドがフェードアウトしていくわけです。
![A06b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/25f650e5-c408-1f32-ee83-5ce2574a1749.png)
設定が済んだら左下のタブからタイムラインに戻ります。
![A06c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/475f9eb2-0d77-605b-b6f7-2e21ad060c04.png)
今度はダッシュ時のトラックに対してAISACを作成します。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3a6f89c7-df7f-81bb-dad4-ce2391e9f10f.png)
AISACの追加も同様です。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/aaa2e002-865b-4795-1ffe-d6784be5939b.png)
こちらはグラフを右肩上がりにします。歩行時はダッシュ音声は聞こえず、ダッシュ値が上がるほどダッシュ用のサウンドに置き換わっていきます。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/48e60a98-5e58-2a65-03af-75f6a7a12824.png)
上部のスライダーを動かして音の変化を確かめてみましょう。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/efb5e43b-8f4d-369a-7cd8-5dad5b601041.png)

タイムラインに戻り、**トラックリストの空欄で**右クリックし、AISACを追加します。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ee367efd-7920-f631-2937-65f13b7881aa.png)
使用するAISAC名、AISACコントロールIDは同じですが、グラフタイプを「ピッチ」にします。
![A12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e93ece99-7d36-89eb-f37b-d90f60c8edab.png)
今度は青いグラフを編集し、ダッシュ値が上がるとピッチが少しだけ上がるようにします。
これにより、速度による細かな足音の変化を表現できます。
![A13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9b194ba3-1536-0d86-8223-daf4ef9aee9c.png)



### 風切り音を作る

風切り音を作ります。
まずはマテリアルツリーの風切り音のマテリアルを選択し、インスペクターにてループ情報の上書きを「True」に、ループタイプを「ループ」に設定します。これでこのマテリアルはループ素材として扱われることになります。
![A14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a2a22df8-85e1-28f7-3ba8-8275961b69b0.png)
キューを作成します。「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択。
![A15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/26da9d77-73d8-6930-fbfe-71bf7e7ec6db.png)
キュー名を「Cue_Act_DashWind」とし、風切り音のマテリアルをドラッグ・アンド・ドロップして配置します。
テスト再生し、キューがループ再生されることを確認します。
![A16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8c756720-ddf2-833a-69a1-f93fccca1e40.png)
トラックリストの空欄で右クリックし、「新規オブジェクト」→「AISACの作成」を選択します。
![A17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/169e9f7f-9cb8-1f90-bee2-b9e4eeae64d5.png)
AISACの追加ウィンドウでは同様のAISAC名にし、グラフタイプを「ピッチ」にします。
![A18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4a2cf149-31b0-fdec-fb8e-e9785e535416.png)
AISACコントロールのグラフでは、数値が上がるごとにピッチも上がっていくよう編集します。
右側の「ポイントリスト」で数値を入力するとかっちり設定できます。
![A19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5449da24-3d1c-ee23-cdde-43149bf8a7d4.png)
グラフができたら、スライダーを動かして音の変化を確認してみましょう。



### キューシートのビルド
ここまでできたら、キューシートをビルドします。
![A20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d4eb25b8-9cb3-0b7a-00b9-e7882c26fcd4.png)
![A21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/caab03b8-9779-7b6c-2987-c0f4f15b325b.png)

ここからUEに移っていきます。



## UEでサウンドを再生する

### キューシートのインポート
ビルドしたacf,acbファイルをコンテンツブラウザにインポートします。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/92ec8e10-1693-0172-b48f-b4fb3f782972.png)
![B01b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d4bd5cdd-15a2-acc3-9685-c4244a8035a2.png)
ツールバーの「Edit」→「Project Settings」を開きます。
![B01c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/44685557-e9b7-9753-04cd-8dbb5b82a154.png)
CriWareタブの「Atom Config」に、ビルドしたacfファイルを指定します。
![B01d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/243754f3-fd96-e4b6-65a0-88d78c71ec85.png)


### ダッシュアクションの実装

キャラクターのダッシュを簡易な方法で実装してみます。
まずはダッシュの入力キー（ボタン）を定義します。
プロジェクト設定を開き……
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6312a848-b7db-4277-9efd-caf67a5be766.png)
Inputタブの「Bindings」→「Action Mappings」の+ボタンを押し、キー入力を追加します。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/338f6cee-5f8e-4f0d-b380-c4c20f7bf739.png)
「Dash」と名前をつけ、左シフトキーなどのキーを設定します。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5436e143-863b-7729-d0d2-d712a95978fe.png)
キャラクターのブループリントを開きます。
イベントグラフに、移動処理などの横に**InputAction Dash**イベントを追加します。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c117f0a4-629b-fd21-a5a4-06e07a465193.png)
「Pressed」「Released」の処理を次のようにつなげます。
ダッシュボタンが押されたら移動速度が「1000」になり、離したら「400」になるだけの簡単なダッシュ機能です。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/de58bf64-9692-1b1a-2b51-901b865162c7.png)


### キャラクターに足音をつける

キャラクターの移動アニメーションを開きます。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/610ff094-3072-62e0-84e4-c9d22ef454a1.png)
タイムライン上で右クリックし、「Add Notify」→「New Notify」を選択します。
![B08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/de147f85-c92a-9fd9-7618-54730bbf85ab.png)
Notifyが追加されるので、「Footstep」と名前をつけます。Notifyはアニメーションの任意のタイミングに組み込め、その時点でイベントを発火させる機能です。
![B09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/89747bb9-37af-db5a-5de7-93390e6c764b.png)
右上のタブからBlueprintを押し、キャラクターのアニメーションブループリントに移動します。
![B10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9f24458c-a2b8-2446-2470-21404975d7db.png)
**AnimNotify_Footstep**イベントを配置し、**Spawn Atom Sound at Location**ノードでサウンドを鳴らします。
「Sound」ピンに忘れず「Cue_Act_Locomotion」を指定します。
![B11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0a29349c-33e3-054f-0b9b-19b43d60118f.png)
**Spawn Atom Sound at Location**は再生用のパラメータを指定してあげる必要があるため、青いインプットピン「Params」から線を伸ばして**Make AtomComponentParams**ノードを置きます。
![B11b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2933f900-e550-f627-8e5a-bceb32e256e3.png)
ノードの中身はいじらなくても大丈夫です。
![B11c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/361b8afc-e71a-c023-d965-4ac65a10597f.png)


### ダッシュ時に足音を変化させる

まずはアニメーションブループリント側でキャラクターがダッシュしているかどうかの情報を受け取りたいため、変数を作成します。
Float型の「Dash」という変数を作成しました。これがAtomCraftで想定していた「ダッシュ値」になります。
![B12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/15aa7bd8-0a87-5258-8a95-9dbc9f74b96c.png)
**キャラクターのブループリント**に戻ります（アニメーションBPではありません）。
**Event Begin Play**時にキャラクターモデルを動かしているアニメーションブループリントにキャストします。
![B13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/44f6a5ec-485a-9d82-3ace-f5894df8dda9.png)
**Cast**ノードの青いアウトプットピンを右クリックし、「Promote to Variable」で変数化しておきましょう。
いちいちキャストしなくても、スムーズにアクセスできるようになります。
![B14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4c435f6f-26ba-5966-fe4c-ae9a409192cc.png)
変数化し、「MyAnim」と名前をつけました。
![B15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/35498254-c627-97da-1579-ab3f7cd1d0a0.png)
これでアニメーションブループリント内の変数「Dash」にアクセスできるので、ダッシュ始動時、終了時に値を代入します。
![B16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1c19dcac-4368-88cf-5fce-aedde925ba10.png)
ふたたびアニメーションブループリントに戻ります。足音のAtomCueに対して、**Set Aisac by Name**でAISACコントロールを行い足音を変化させます。
![B17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7196fd13-9e75-498a-8985-664fc951316e.png)



### ダッシュ時に風切り音を再生する

風切り音の実装はゲーム開始時からボリューム0の状態でキャラクターに追従させておき、ダッシュ時に音量を変化させる、というアプローチをとります。
**Event Begin Play**の後に**Spawn Atom Sound Attached**ノードでキャラクターにサウンドを追従させます。
これも「Promote to Variable」で変数化しておきましょう。
![B19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c0eae24d-d365-06ca-c0c1-7e53fb6cf572.png)
ダッシュ時に音量を滑らかに変化させたいので、タイムラインノードを活用します。
「Add Timeline」でタイムラインを追加します。
![B20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/12cf4248-f743-3c1c-b8c0-b8cc50fca21c.png)
ダッシュ始動時に「Play」、ダッシュ終了時に「Reverse」につなげます。
![B21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/08a62310-7100-fb97-9d88-e76ffe24df24.png)
タイムラインノードをダブルクリックして開きます。
Floatトラックを追加します。タイムラインの長さは1秒とします。
![B22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9d82d00d-4eee-a912-1c4b-0d50e4d63a1c.png)
1秒かけて値が0～1に上昇するグラフを作ります。
![B23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2e425eef-4671-49ce-7e4d-7fbe8ed0729a.png)
グラフで変化した値をAisacコントロールの値に代入します。
![B24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/320eaa8f-6ba7-d99f-664c-88d2a9751b18.png)
これでダッシュ時に風切り音がフェードイン、フェードアウトするようになりました。

ひとまずここでダッシュに関わるサウンド演出は実装できましたが、次の記事で「ダッシュ速度、音が段々と変化していく」「より速い速度での演出」などについて改善する実装についてまとめています。よろしければこちらもぜひ。

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