UE4で返り血の表現

こんにちは。記事名が物騒ですみません。書いていきたいと思います。
今回やる処理はこんな感じ。
www.youtube.com
では、やっていきましょう。


1 : 血のマテリアルの作成

f:id:ikagamedev:20170223033901p:plain

マテリアルはとても簡単です。血のテクスチャですが、

youtu.be
こちらの方が配布してくださっているので、ありがたく頂戴しましょう。


2 : 適当な StaticMesh にマテリアルを割り当てる
f:id:ikagamedev:20170223034233p:plain


3 : BP_BloodDecal クラスの作成
ComponentStaticMesh を追加し、Pitch 方向に +90します。Blueprint ですが、今回はこれしか書きません。
f:id:ikagamedev:20170223035610p:plain

X, YScale変数ですが、Editable, Expose on Spawn チェックを入れるのを忘れないようにしましょう。
f:id:ikagamedev:20170223035725p:plain

最後に、Component BP_BloodDecal をクリックし Initial Life Span をいい感じの値にしましょう。
f:id:ikagamedev:20170223040133p:plain


4 : BP_BloodDecal を Spawn したい Character クラスでの処理
倒れる時に BP_BloodDecalSpawn したいと思います。(なので今回は Event AnyDamage のあとに呼び出しています。ここら辺はお好みでどうぞ。)

(1) 壁に返り血が付く処理について
f:id:ikagamedev:20170223041127p:plain
まず、LineTraceStart, End を求めていきます。

Start
自分自身の Location をゲットしたいので、GetActorLocation します。それを分解しZ軸方向にだけ加減算しています。これによって、LineTraceStart するZ位置に変化を持たせています。


End
For loopNumOfLoops 数ループさせます。(360 / NumOfLoops) * IndexMake Rotator することで、For Loop が一度終わる度 Index が増えていくので 360°になるまで NumOfLoops 数ループしてくれます。 そのあと、GetRotationXVector でX方向ベクトルを返し、300を掛けています。この300ですが、LineTraceが届く距離です。こうして出てきたベクトルの値と、Start ベクトルを足すことで End ベクトルが導かれます。(Actors ignore は気にしなくていいです。)

(2) BP_BloodDecal を Spawn させる処理について
f:id:ikagamedev:20170223041131p:plain
まず、当たったかどうかの判定の為に Branch を挟みます。次に、Spawn Actor From Class のパラメーターについて説明します。

Class

これは紛れもなく、BP_BloodDecalSpawn して下さい。

Collision Handling Override
こちらは、Collision は無視して毎回 Spawn させたいので Always Spawn, Ignore Collisions を選択します。

X, YScale
BP_BloodDecalExpose on Spawn にチェックを付けたので出てきたパラメーターです。こちらはランダムな値で出てほしいので Random Float in Range ノードを使っています。

Spawn Transform
Location
Impact Point 直繋ぎでもよさそうですが、Z-Fight が起きてしまうので Impact Normal だけ足しています。
www.youtube.com


Rotation
まず、HitResult 構造体を分解します。その中にある情報から今回使うのは Impact Point と、Impact Normal のみです。
Find Look at Rotation ノードで、角度を求めていきます。Start は、当たったポイントなので、Impact PointTargetImpact Point + (Impact Normal * 90) で求められます。(Impact Normal, Normal正規化 されているので返ってくる値は-1 ~ 1です。)

Scale
こちらは設定する必要はありません。

以上で壁への返り血は完了です。次は、地面への返り血です。


(1) Spawn Transform についての処理

f:id:ikagamedev:20170223051921p:plain
Location
まず、Character クラス前提の話なのですが、Capsule ComponentWorld Location をゲットします。恐らくですが、GetActorLocation でも同じ結果が見込まれます。(Capsule Component WorldLocationCapsule の中央 = Root = GetActorLocation...?)
ゲットした Capsule World Location から Capsule の大きさを引くことで、BP_BloodDecalSpawn する位置を地面にオフセットします。(つまりZ軸は0。なので地面に Spawn します。)
そして、そのベクトルを分解します。このまま Location に入力してもいいのですが、せっかく For loop で複数回 Spawn させたいと思っているので X, Y 軸方向にランダムなフロート値を足したいと思います。これは単純で、For loopIndex と ランダムなフロート値を掛けて、それぞれ X, Y に足しています。そして、Make Vector して Location は終了です。


Rotation
Find Look at RotationStart から説明します。Start は 先ほどの処理だと Trace が当たった位置でした。ですが、今回の処理は毎回地面なので Capsule World Location(Z) - Capsule Half HeightOKです。
Target ですが、ImpactPoint の代わりが Capsule World Location(Z) - Capsule Half Height でしたので、その通りにつなぎます。では、Impact Normal はどうするかですが要するに、地面の法線ベクトルを取れればいいです。地面の法線ベクトル = Character Up Vector なので90をかけるベクトルは Capsule Up Vector です。(今回、敵が死亡した時メッシュに物理シミュレーションを適用していますので Capsule ComponentUp Vector を取っています。)

以上で完了です。お疲れさまでした。プレイして試してみましょう。
最後までご覧いただきありがとうございました。良い、Unreal Engine ライフを!