ぼっちプログラマのメモ

Unreal Engineについて書いたりしてます

UE4で、地面の種類に応じた足音を鳴らすようにしてみる その1

はじめに

足音に拘っているゲームっていいですよね。心が洗われます。
ということで、今回は地面の種類に応じて足音を使い分けてみます。

作ってみた一例
(SEは魔王魂 | 無料で使える森田交一の音楽より、テキトーにチョイス)
youtu.be

処理の流れ的には、以下の様な感じです。

  1. 足音を鳴らすタイミングの指定
  2. 地面の種類の検出
  3. 検出した地面の種類に応じた足音を鳴らす

参考サイト様
花咲か妖精 ウルトラアンコール


足音を鳴らすタイミングの指定

足音を鳴らしたいモーションに
足音を鳴らすタイミングを埋め込みます。

モーションアセットを開き、通知バー(?)上で開ける
右クリックメニューから通知を追加するだけです。超簡単です。

今回は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を使った方法

コリジョン(当たり判定)でよくお世話になる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…)

その2へ
pafuhana1213.hatenablog.com