はじめに
足音に拘っているゲームっていいですよね。心が洗われます。
ということで、今回は地面の種類に応じて足音を使い分けてみます。
作ってみた一例
(SEは魔王魂 | 無料で使える森田交一の音楽より、テキトーにチョイス)
youtu.be
処理の流れ的には、以下の様な感じです。
- 足音を鳴らすタイミングの指定
- 地面の種類の検出
- 検出した地面の種類に応じた足音を鳴らす
参考サイト様
花咲か妖精 ウルトラアンコール
足音を鳴らすタイミングの指定
足音を鳴らしたいモーションに
足音を鳴らすタイミングを埋め込みます。
モーションアセットを開き、通知バー(?)上で開ける
右クリックメニューから通知を追加するだけです。超簡単です。

今回はFootStepという通知を追加しました。
通知を追加すると、AnimationBPのEvent Graph上で
追加した通知と同じ名前のイベントノードが使えるようになります。

このイベントノードは、先ほど埋め込んだタイミングで動作します。
ということは、このイベントノードに以下の処理を繋げると
いい感じに足音の使い分けが実装できそうです。
- 地面の種類の検出
- 検出した地面の種類に応じた足音を鳴らす
地面の種類の検出
地面の情報を取得
地面の判定には、Line Traceを使います。真下に向かって線を引き、
衝突した部分を地面と見なして、衝突情報から地面の情報を取得する感じです。

サクッとノードを貼ります。本来は足の位置で線を引くべきですが、
ノードの簡略化のため、単純にActorの座標を使っています。
また、座標に対して加算減算している部分はてきとーな値です。
状況に応じて、いい感じに調整するといい感じになると思います。

捕捉:Line Traceに関しては、以下のページが参考になると思います。
https://docs.unrealengine.com/latest/JPN/Gameplay/HowTo/UseRaycasts/Blueprints/index.html
地面の種類を判別
Line Traceを使うことで、(おそらく)地面であるオブジェクトの
情報を取得することができました。次は、その情報を元に
その地面の種類(草原?荒れ地?など)を判別します。
今回は、以下の2通りの方法を使って、地面の種類を判別してみました。
- Tag
- Surface Type
Tagを使った方法
コリジョン(当たり判定)でよくお世話になるTagを使う手法です。
まずは、地面に当たるActorのActor Tagに
判別用の文字列を入力します(Component Tagではありません)。

そして、Line Traceで取得したActorが持つTagと
先ほど入力した名前と比較し、地面の種類を判定します。

(後々の処理の都合で、Ground Typeという整数型の変数に判定結果を入れています)
この手法は単純で良いのですが、ノードが汚い + Tag名の入力ミスの可能性という
欠点があります。10数個並ぶBranchはあまり見たくないものです。
Surface Typeを使った方法
こちらは、物理マテリアルのSurfaceTypeを使う手法です。
Tagを使った手法に比べて、とてもシンプルなノードで地面の種類を判別できます。
が、幾つか下準備が必要になります。
まずは、地面の種類に応じたSurface Typeを定義します。
定義は、「プロジェクト設定」→「物理」→「Physical Surface」で行います。

次に、地面の種類に応じた物理マテリアルアセットを作成します。
そして、そのアセットのSurfaceTypeに先ほど定義したパラメータを指定します。


最後に、地面に当たるActorに対して、物理マテリアルアセットを割り当てます。

これで下準備は終了です。お疲れ様でした。
あとは、Line Traceで取得した情報からSurface Typeを抽出するだけです。
こんな感じに。

ふふ、なんてシンプルで美しいノードなんだろう…
あとは、判別した地面の種類に応じて足音を鳴らすだけです!
なのですが、記事が長くなってきたので、今日はここまで。

(眠くなってきたからだなんて、口が裂けても言えないや…ZZZ…)
