読者です 読者をやめる 読者になる 読者になる

ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

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

はじめに

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

作ってみた一例
(SEは全曲無料・フリー音楽素材/魔王魂より、テキトーにチョイス)youtu.be

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

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

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


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

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

モーションアセットを開き、通知バー(?)上で開ける
右クリックメニューから通知を追加するだけです。超簡単です。
f:id:pafuhana1213:20150519231509j:plain
今回はFootStepという通知を追加しました。

通知を追加すると、AnimationBPのEvent Graph上で
追加した通知と同じ名前のイベントノードが使えるようになります。
f:id:pafuhana1213:20150519232126j:plain

このイベントノードは、先ほど埋め込んだタイミングで動作します。
ということは、このイベントノードに以下の処理を繋げると
いい感じに足音の使い分けが実装できそうです。

  • 地面の種類の検出
  • 検出した地面の種類に応じた足音を鳴らす

捕捉

足音を使い分ける必要のない場合は、アニメーションの通知バーに
通知ではなく、サウンドを埋め込むと簡単に鳴らすことができます。
また、サウンドの他にもエフェクト(例:土煙)を埋め込むことができます。
f:id:pafuhana1213:20150519232837j:plain


地面の種類の検出

地面の情報を取得

地面の判定には、Line Traceを使います。真下に向かって線を引き、
衝突した部分を地面と見なして、衝突情報から地面の情報を取得する感じです。
f:id:pafuhana1213:20150519233638j:plain

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

捕捉:Line Traceに関しては、以下のページが参考になると思います。
ブループリントにおけるレイキャスト(トレーシング)の使い方 | Unreal Engine


地面の種類を判別

Line Traceを使うことで、(おそらく)地面であるオブジェクトの
情報を取得することができました。次は、その情報を元に
その地面の種類(草原?荒れ地?など)を判別します。

今回は、以下の2通りの方法を使って、地面の種類を判別してみました。

Tagを使った方法

コリジョン(当たり判定)でよくお世話になるTagを使う手法です。

まずは、地面に当たるActorのActor Tag
判別用の文字列を入力します(Component Tagではありません)。
f:id:pafuhana1213:20150519235312j:plain

そして、Line Traceで取得したActorが持つTagと
先ほど入力した名前と比較し、地面の種類を判定します。
https://dl.dropboxusercontent.com/u/30427841/0519/tag.JPG
(後々の処理の都合で、Ground Typeという整数型の変数に判定結果を入れています)

この手法は単純で良いのですが、ノードが汚い + Tag名の入力ミスの可能性という
欠点があります。10数個並ぶBranchはあまり見たくないものです。

Surface Typeを使った方法

こちらは、物理マテリアルのSurfaceTypeを使う手法です。
Tagを使った手法に比べて、とてもシンプルなノードで地面の種類を判別できます。
が、幾つか下準備が必要になります。

まずは、地面の種類に応じたSurface Typeを定義します。
定義は、「プロジェクト設定」→「物理」→「Physical Surface」で行います。
f:id:pafuhana1213:20150520000717j:plain

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

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

これで下準備は終了です。お疲れ様でした。
あとは、Line Traceで取得した情報からSurface Typeを抽出するだけです。
こんな感じに。
f:id:pafuhana1213:20150520001736j:plain
ふふ、なんてシンプルで美しいノードなんだろう…


あとは、判別した地面の種類に応じて足音を鳴らすだけです!
なのですが、記事が長くなってきたので、今日はここまで。

f:id:pafuhana1213:20150520002140j:plain
(眠くなってきたからだなんて、口が裂けても言えないや…ZZZ…)

その2へpafuhana1213.hatenablog.com