ゲームアニメーションサンプルには音を変える仕組みがすでに入っていますが、コンクリート用しか設定がなく、切り替え部分が実装されていません。
これを仕上げて使えるようになりましょう。
改造
動画は仕組みの説明からにしましたが、本記事は先に実際やることから説明します。
AudioBank(音データベース)の用意
コンテンツ/Audio/Foley に効果音関連アセットが入っています。

デフォルトのAudioBankを複製します。

中身はGamePlay Tagで定義される効果音イベントをキーに、その時鳴らす音が設定されているマップ構造です。


チューザーテーブルとかでもできそうですね
キーはそのままで、値を置き換えていきます。
音素材は下記を使いました。(無料 FAB Standard License)


CUEがMetaSoundsの前のやつでWAVは元素材です。
雪はSnow, 泥にはSlushを使いました。
※ 音量がGASPのコンクリートより全体的に大きいので調整が必要です
Walkのイベントに、Walk用のサウンドキューを設定します。

ほかも同様ですが、アセットにないものは別途用意するか既存のものを流用、もしくはコンクリートのままで代用するなどしましょう。
ちなみに、サウンドキューはこのように複数の音からランダムに選択する仕組みなどが作れるので、再生するたびに微妙に違う音を鳴らしたりもできます

Randomの次のModulatorでピッチ(音の高さ)と音量も調整可能です。
今回はガラス用、泥用、雪用を作りました。

これでデフォルトのコンクリートと合わせて4種類鳴らし分けられますね
Physical Surface
次にどの状況でそれらの音を鳴らし分けるかのカテゴリの定義です。
プロジェクト設定/エンジン/物理/Physical Surface

鳴らし分けしたい地面の種類を登録します。
ここでは水 water, 雪 snow, 泥 mud, 草 grass, ガラス glassを登録しました

列挙型になるので順番は関係ありませんが、隙間は開けないほうがいいかも
物理マテリアル
さきほどのPhysicalSurfaceをそのまま使えればよいのですが、それを設定する箇所は「物理マテリアル」にあります。
コンテンツブラウザ右クリックから物理/物理マテリアルを作成しましょう

通常1種類しか選択肢でませんが、クリックして「選択」で作成できます。

PM_mud, PM_snow, PM_glassを作成しました。
Physical Material で「PM_**」と付ける慣習みたいです。
中身は、摩擦の設定で氷の上はつるつる摩擦が低くて滑りやすいとか、水の中は抵抗が大きく移動速度が落ちるなどの設定をするための仕組みがメインですが、
いま設定したいのはフィジカルプロパティ/Surface Type です。ここに先ほど登録したPhysicalSurfaceが出てくるので設定しましょう。
鳴らし分け処理実装
後は、Get FoleyAudio Bank で、状況に応じたオーディオバンクを返す処理です
CBP_SandBoxCharacter > GetFoleyAudioBank (インターフェースのところ)

スイッチで列挙型の変数に応じてどのオーディオバンクを返すかを切り替えます
その条件はLineTrace By ChannelでMeshのワールド位置からZ方向に上20から下20まで探索して、ぶつかったもののSurfaceTypeを取得しています。

Hitしなかった場合は空中にいたり埋もれていたりすると思いますが、そのときはデフォルトを返すようにしておくのがベターかと思います。手をつく音など、Foley≠足音なので。
使用方法
スタティックメッシュなどのアクタの詳細欄/コリジョンのところにある「Phys Material Override」に物理マテリアルを登録します。

または、マテリアルにも設定があります。(上記はこっちの設定を上書きできるので強いです)



こちらの設定はこのマテリアルを貼っている部分だけに効果がつくので、複数マテリアルを塗り分けしていれば一つのスタティックメッシュでも素材ごとに音を変えるといった使い方ができますね。
構造説明
アニメーションシーケンス
→ アニメーション通知 で BP_AnimNotify_FoleyEvent_Run_Rなどが呼び出し
→ データクラス なので処理はない
→ 親クラス BP_AnimNotify_FoleyEvent Recieved_Notifyイベント
→ 内部関数 GetFoleyAudioBank
→ メッシュの GetFoleyAudioBank インターフェース関数コール
→ CBP_SandboxCharacter/GetFoleyAudioBank 実装
←←←←ここで地面ごとのAudioBankを返す
→ AudioBankのGetSoundfromFoleyEventでイベントをキーに具体的音が選択
→ PlaySoundatLocationで鳴る
※別途、CBP_SandboxCharacter>PlayAudioEventを経由して音を鳴らすルートもあります。
Event On Jumped – Play a sound whenever the character jumps. This could be done with audio events on the jump animations, but this way gives us more consistent timing, since Motion Matching can pick different entry frames of the jump animations.
GameAnimationSample / CBP_SandBoxCharacter > イベントグラフ

ジャンプ時と着地時の音が、モーションマッチングで微妙に開始がズレる都合、アニメーション通知からだと安定しないのでCBPから直接鳴らしているとのこと。
コメント