UE4で返り血の表現
こんにちは。記事名が物騒ですみません。書いていきたいと思います。
今回やる処理はこんな感じ。
www.youtube.com
では、やっていきましょう。
1 : 血のマテリアルの作成
マテリアルはとても簡単です。血のテクスチャですが、
youtu.be
こちらの方が配布してくださっているので、ありがたく頂戴しましょう。
2 : 適当な StaticMesh にマテリアルを割り当てる
3 : BP_BloodDecal クラスの作成
Component に StaticMesh を追加し、Pitch 方向に +90します。Blueprint ですが、今回はこれしか書きません。
X, YScale変数ですが、Editable, Expose on Spawn チェックを入れるのを忘れないようにしましょう。
最後に、Component の BP_BloodDecal をクリックし Initial Life Span をいい感じの値にしましょう。
4 : BP_BloodDecal を Spawn したい Character クラスでの処理
倒れる時に BP_BloodDecal を Spawn したいと思います。(なので今回は Event AnyDamage のあとに呼び出しています。ここら辺はお好みでどうぞ。)
(1) 壁に返り血が付く処理について
まず、LineTrace の Start, End を求めていきます。
Start
自分自身の Location をゲットしたいので、GetActorLocation します。それを分解しZ軸方向にだけ加減算しています。これによって、LineTrace が Start するZ位置に変化を持たせています。
End
For loopで NumOfLoops 数ループさせます。(360 / NumOfLoops) * Index で Make Rotator することで、For Loop が一度終わる度 Index が増えていくので 360°になるまで NumOfLoops 数ループしてくれます。 そのあと、GetRotationXVector でX方向ベクトルを返し、300を掛けています。この300ですが、LineTraceが届く距離です。こうして出てきたベクトルの値と、Start ベクトルを足すことで End ベクトルが導かれます。(Actors ignore は気にしなくていいです。)
(2) BP_BloodDecal を Spawn させる処理について
まず、当たったかどうかの判定の為に Branch を挟みます。次に、Spawn Actor From Class のパラメーターについて説明します。
Class
これは紛れもなく、BP_BloodDecal を Spawn して下さい。
Collision Handling Override
こちらは、Collision は無視して毎回 Spawn させたいので Always Spawn, Ignore Collisions を選択します。
X, YScale
BP_BloodDecal で Expose 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 Point。 Target は Impact Point + (Impact Normal * 90) で求められます。(Impact Normal, Normal は 正規化 されているので返ってくる値は-1 ~ 1です。)
Scale
こちらは設定する必要はありません。
以上で壁への返り血は完了です。次は、地面への返り血です。
(1) Spawn Transform についての処理
Location
まず、Character クラス前提の話なのですが、Capsule Component の World Location をゲットします。恐らくですが、GetActorLocation でも同じ結果が見込まれます。(Capsule Component の WorldLocation は Capsule の中央 = Root = GetActorLocation...?)
ゲットした Capsule World Location から Capsule の大きさを引くことで、BP_BloodDecal を Spawn する位置を地面にオフセットします。(つまりZ軸は0。なので地面に Spawn します。)
そして、そのベクトルを分解します。このまま Location に入力してもいいのですが、せっかく For loop で複数回 Spawn させたいと思っているので X, Y 軸方向にランダムなフロート値を足したいと思います。これは単純で、For loop の Index と ランダムなフロート値を掛けて、それぞれ X, Y に足しています。そして、Make Vector して Location は終了です。
Rotation
Find Look at Rotation の Start から説明します。Start は 先ほどの処理だと Trace が当たった位置でした。ですが、今回の処理は毎回地面なので Capsule World Location(Z) - Capsule Half Height でOKです。
Target ですが、ImpactPoint の代わりが Capsule World Location(Z) - Capsule Half Height でしたので、その通りにつなぎます。では、Impact Normal はどうするかですが要するに、地面の法線ベクトルを取れればいいです。地面の法線ベクトル = Character Up Vector なので90をかけるベクトルは Capsule Up Vector です。(今回、敵が死亡した時メッシュに物理シミュレーションを適用していますので Capsule Component の Up Vector を取っています。)
以上で完了です。お疲れさまでした。プレイして試してみましょう。
最後までご覧いただきありがとうございました。良い、Unreal Engine ライフを!