UE5の吹き飛ばし処理について
UE5で攻撃を当てた場合に相手を吹き飛ばす処理を行いたいことは多いはず。
これまでの以下の記事で右手でパンチを繰り出しダメージを与えHP0なら死亡させられるようにしている。この記事ではこれらをベースに攻撃を当てた敵をAdd Movement Inputを使って吹き飛ばせるようにしていく。
④視点変更
⑤弾を撃つ
⑦死亡処理
先に確認してみてほしい。
Get・SetやSequenceやBranchといった基礎的なノードがわからない場合は先に以下記事を確認してほしい。
アンリアルエンジンのノードの一覧UE5の吹き飛ばし処理の目次
ベクトル作成ダメージ処理へのノード追加
吹き飛ばし処理作成
目次にもどる
ベクトル作成
以前の記事作成したインターフェースのI_Characterを開く。
Damageの関数を選択し、インプットに新たにBlowRotation(Vector型)、Blowtime(Float型)の変数を追加する。
.jpg)
コンパイルする。
以前の記事でBP_Player(操作キャラ)について、Cキーを押すと攻撃のアニメーションモンタージュが再生され、Animnotifyの通知を使って、パンチを繰り出したら右手に設置したRightPunchCollisionを作動させて敵に当たったらダメージ処理が行われるようにした。
その時のイベントグラフのOn Component Begin Overlap(RightPunchCollision)のノードが以下の通り。
.jpg)
以下のようにノードを追加する。
.jpg)
今回は操作キャラから見て、敵がいる方向へ敵を吹き飛ばす。よって、Get Actor Locationで操作キャラの位置(Selfでとってこれる)と敵の位置(On Component Begin OverlapのOther Actorからぶつかったアクタが参照でき、そこからとってこれる)を取得。
操作キャラの位置を原点と考え、敵の位置から操作キャラの位置を引き算することで、自分から敵に向かうベクトルを作成することができる。
続いてNormalizeノードをつなぐことで正規化(ベクトルの向きを変えずに大きさを1にする)し単位ベクトルを作成できる。知りたいのは向きであり、ベクトルの長さは改めて設定するためにこの作業を行った。
単位ベクトルに今回は100をかけてベクトルの長さを調整する。このかけた数値が吹き飛ばしの強さとなるように、後の処理で作っていく。
完成したベクトルをインターフェースのダメージ関数のBlow Vectorへ入力している。
インターフェースのダメージ関数のBlowtimeは吹き飛ばす時間である。ここはひとまず0.5を設定している。
目次にもどるダメージ処理へのノード追加
以前の記事でBP_Character(操作キャラや敵キャラの親クラス)のDamage関数のインターフェースにダメージ処理を作成した。
.jpg)
そこへ以下のようにノードを追加する。

ダメージ計算と直接の関連はないが、ダメージ処理が始まったタイミングで吹き飛ばしに関わる変数を操作したいので、ここにノードを追加している。
BlowtimeとBlow Vectorについては値を受け取り、対応する変数を作成しセットしただけ。
Blow(Boolean型)も作成し、ここでチェックをつけtrueにしている。後で詳しく説明する。
目次にもどる吹き飛ばし処理作成
BP_Characterのイベントグラフで引き続きノードの追加を行っていく。
Event Tick(フレームごとに呼び出されるイベント)に以下のようにノードを追加していく。
.jpg)
まずは前半の処理から見ていこう。
.jpg)
Event TickのDelta Secondsからは1フレームごとの時間がとってこれるので、それをDelta Seconds(Float型)の変数を作ってセットしている。
次にBranchを配置しており、Blow(先ほどダメージ処理のところでTrueにした)の変数がTrueの時にAdd Movement Inputノードが処理される。
Add Movement Inputノードはキャラを特定の方向へ移動させるノードだ。先ほどセットした変数Blow Vectorからベクトルを受け取り、ベクトルの方向へ、ベクトルの長さだけ移動する。
Add Movement InputのノードのScale Value(掛け算を行う)にはDelta Seconds(1フレームの時間)を入れている。
これはマシンスペックが異なる場合でも同じ移動距離とするためにおこなっている。
例えば、1秒に60フレーム出る場合は1フレームの時間は1/60秒、マシンスペックが低く1秒に30フレームしか出ない場合は1フレームの時間は1/30秒。掛け算を行うので1/60秒となる60フレームのほうがAdd Movement Inputで進む距離が短くなる。
Event Tick(フレームごとに呼び出されるイベント)なので、30フレームの時より60フレームのほうがAdd Movement Inputが行われる回数は多くなる。よって総合的な移動距離は同等となる。
続いて後半の処理を見ていこう。
.jpg)
Add Movement Inputノードの後は吹き飛ばす時間の計算処理となっている。
Blow time(今回は0.5に設定)からDelta Seconds(1フレームごとの時間)だけ引き算する。
その値をBlow timeにセットし、値が0より大きいならTrue、そうでないならfalseが出力され、それをBlowにセットする。
ここで再び前半を確認してほしい。
.jpg)
このイベントはEvent Tickなので毎フレーム実行されるが、BranchではBlowがTrueでAdd Movement Input以降の処理が起き、Falseではこの後は一切処理が起きない。
つまり、Blow timeが引き算されていき0以下になるまでは、毎フレームAdd Movement Inputで攻撃を受けたキャラが移動するという処理になっている。
これで以下のように吹き飛ばし処理が行われる。
敵キャラが瞬時に移動するのではなく、時間をかけて吹き飛ぶという挙動を実現することができた。
次の記事では先行入力でコンボ攻撃ができるようにしていく。
⑩コンボ(先行入力)