UE5のダメージ処理について
UE5でダメージ処理をどう実装するかについて紹介していく。
これまでの以下の記事で銃を持たせ、エイムし弾を撃てるようにしている。この弾が当たると敵にダメージが入るようにしていこうと思う。
④視点変更
⑤弾を撃つ
先に確認してみてほしい。
Get・SetやSequenceやBranchといった基礎的なノードがわからない場合は先に以下記事を確認してほしい。
アンリアルエンジンのノードの一覧UE5のダメージ処理の目次
当たり判定をつけるインターフェース作成
ダメージ処理
目次にもどる
当たり判定をつける
まず、以前までの記事で作成した弾にコリジョンを使って当たり判定をつけていく。
コリジョンがよくわからない場合は先に以下の記事を確認してみてほしい。
以前の記事で作成したBP_Bulletを開く。
コンポーネントタブで追加を選択し、Collsionの項目から今回はCapsule Collisionを選択して追加する。
.jpg)
Capsuleを選択しビューポートを見る。
.jpg)
Capsuleの位置・向き・大きさを調整し、弾のNiagaraが表示されている範囲を覆うようにする。
.jpg)
Capsuleを選択し右クリックし、イベントを追加→On Component Begin Overlapを選択する。
.jpg)
イベントグラフに以下のようなノードができる。一旦コンパイルして閉じる。

次に弾を喰らう敵を作成する。
好きな敵を用意すればいいが、今回は以下の無料アセットのオークを使って説明していこうと思う。
Warrior Orc(無料のオークのアセット)コンテンツドロワーを開き任意の場所で右クリックしブループリント→ブループリントクラスと選択。
.jpg)
キャラクターを選択。
.jpg)
できたブループリントにBP_Orcと名前をつけて開く。
コンポーネントタブでBP_Orcを選択し、詳細タブのメッシュの矢印を選択し、SK_Warrior_Orcを選ぶ。

SK_Warrior_OrcのメッシュをCapsule Componentが覆うようにする(メッシュまたはCapsule Componentの大きさ・位置を調整)。
.jpg)
続いて、操作キャラ、敵、弾のコリジョン設定を新たに作成していく。
まず、上部メニューの編集を選択し、プロジェクト設定を押す。
.jpg)
左側のメニューでコリジョンを選択し、新規のオブジェクトチャンネルを押す。
.jpg)
名前をPlayerとして、承認を押し、作成する。

同様にEnemyとBulletも作成する。
.jpg)
BP_Playerを開き、コンポーネントタブのCapsule Componentを選択する。
詳細タブのコリジョンの項目のコリジョンプリセットをCustomに変更し、Object TypeをPlayerにする。オブジェクト応答のBulletをオーバーラップに変更する。
.jpg)
同様にBP_Orcを開き、Capsule Componentを選択する。
詳細タブのコリジョンの項目のコリジョンプリセットをCustomに変更し、Object TypeをEnemyにする。オブジェクト応答のBulletをオーバーラップに変更する。
.jpg)
同様にBP_Bulletを開き、Capsuleを選択する。
詳細タブのコリジョンの項目のコリジョンプリセットをCustomに変更し、Object TypeをPlayerにする。トレース応答・オブジェクト応答について全て無視を選択する。
.jpg)
そして操作キャラが弾を発射(弾がリスポーン)する処理の後にオブジェクト応答のEnemyについてOverlapに変更するようにSet Collsion Response to Channelノードを作成して配置する。

最初からオブジェクト応答のEnemyがOverlapだと、敵の至近距離で撃ち弾がリスポーンした瞬間に敵に当たると、攻撃力が入る前にダメージ処理が行われてHPが減らないバグが発生したため。
目次にもどるインターフェース作成
インターフェースは「相手が不明でも同じ処理を行う」という時に役立つ。
例えば、今回行おうとしているダメージ処理もそうだ。
操作キャラが敵を、銃で撃っても格闘攻撃で殴っても、攻撃力を元に同じダメージ処理を行う必要がある。
更に言えば、敵が操作キャラを撃ったり殴ったりする場合も同じ処理が必要だ。
別にCast toなどで誰の銃攻撃なのか格闘攻撃なのか特定した上で処理することも可能だが、それでは処理が重くなってしまう。ぜひインターフェースを使いたい。
そこで今回はインターフェースを作り、BP_Player(操作キャラ)とBP_Orc(敵)の親クラスBP_Characterを作成し、BP_Characterにインターフェースを適用しようと思う。
任意の場所で右クリックし、ブループリント→ブループリントインターフェースを選択する。
.jpg)
できたファイルにI_Characterと名前をつける。
次にBP_Characterのブループリントを作り、BP_PlayerとBP_Orcの親クラスとする。
親クラスについてわからない場合、以下の記事を確認してほしい。
I_Characterを開き、追加→関数のように選択しDamageの関数を作成する。
.jpg)
Damageの関数を選択して詳細タブのインプットで+マークを押して追加し、DamageValueを作成し型はintegerにする。

これは、Damage関数内で必要になるダメージの値を与えるための引数として使う。
コンパイルする。
BP_Characterを開き、クラス設定を選択し、詳細タブの実装インターフェースでI_Characterを選択する。
.jpg)
変数としてHPとATK(攻撃力)を作成する。
加えてデータアセット用のクラスを入れるBP_WEAPONの変数を作っている。

データアセットに各武器のステータスを入れて、そこから武器の攻撃力をとってきている。
必ずしもデータアセットを使う必要はない。詳しく知りたい場合は以下の記事を確認してほしい。
インターフェースのDamageを選択し、以下のようにノードを配置してつなげる。
.jpg)
Event Damageは最初から出ている。Subtract(減算)を使って、HPからDamage Value(攻撃力の値が入っている)の値を引き算しその値をHPにセットするだけの簡単な処理となっている。好みで防御力などを入れてもっと複雑な処理にしてもいい。
テスト用にHPにセット後の値をPrint Stringに入れるようにしている。
これでインターフェースのdamage関数は完成だ。コンパイルしよう。
目次にもどるダメージ処理
BP_bulletを開く。この記事の最初で当たり判定を持たせる作業をしており、現状はイベントグラフにOn Component Begin Overlapのみ出した状態になっている。

ここから出力のOther Actorからワイヤーを伸ばして、先ほど作成したインターフェースのDamageの関数を出す。
.jpg)
On Component Begin Overlapに以下のようにノードをつなぐ。
.jpg)
On Component Begin OverlapのOther Actorには接触したアクタが出力されており、それをDamage関数のTargetへつなぐことで、 TargetがDamageのインターフェースを持つブループリントであればダメージ処理を行うことができる。
BP_Characterのインターフェースは子クラスであるBP_PlayerとBP_Orcにも継承されているので、弾を撃ち当たったのがBP_Orcであればダメージ処理を行うことができる。将来的にはBP_Orcの攻撃でBP_Playerがダメージを喰らうといった処理も必要だが、それも同様の方法で簡単に作ることができる。
Bullet ATKには何らかの方法で攻撃力の数値を入れておく。自分の場合はデータアセットの武器の攻撃力の値を入れている。それをDamage関数のDamage Valueに入力することで関数の計算が可能となる。
コンパイルする。
BP_Orcのブループリントを開き、コンポーネントタブでBP_Orcを選択する。
詳細タブでデフォルトの項目を見る。ここには親クラスで作成した変数にデフォルト値を入れることが可能となっている。今回はHPを100にしてみる。
.jpg)
BP_Orcのブループリントをドラッグ&ドロップしてレベル上に配置する。
.jpg)
これで以下のように銃を撃って弾が敵に当たると、ダメージ処理が行われ以下のようにPrint Stringで現在のHPが表示される。今回は銃の攻撃力を50にしているので50ずつHPが減っているのがわかる。
後はHPの数値を元に、HP0以下なら倒れるアニメーションを入れたり、HPバーを作成したりすればゲームらしくなる。
次の記事では敵に攻撃を当てHPを0にすることで死亡させられるようにする。
⑦死亡処理