ゲーム開発必ず通る実装

[UE5] ダメージ処理の基本:Apply Damage と Event AnyDamage

目次
  1. 仕組みの全体像
  2. 送る側:Apply Damage
  3. 受け取る側:Event AnyDamage
  4. HP を 0 未満にしない
  5. 0 になったら死亡処理
  6. 当たった位置や範囲が必要なとき

敵に攻撃を当てて HP を減らす処理は、どんなゲームでもほぼ必ず作ることになります。UE5 にはダメージを受け渡すための仕組みが最初から用意されているので、自前で「相手の HP 変数を直接いじる」必要はありません。

仕組みの全体像

ダメージのやりとりは 送る側 と 受け取る側 に分かれます。

役割 使うノード 置く場所
送る側 Apply Damage 武器・弾・プレイヤーなど攻撃する側
受け取る側 Event AnyDamage 敵・プレイヤーなど HP を持つ側

攻撃側は「誰に・いくつ」だけ伝えればよく、受けた側がどう減るか(防御力、無敵時間など)は受け取る側で決められます。お互いの中身を知らなくて済むのがこの形の良いところです。

送る側:Apply Damage

当たり判定(On Component Begin Overlap など)で相手を取得したら、Apply Damage を呼びます。

  • Damaged Actor:ダメージを与える相手
  • Base Damage:ダメージ量
  • Event Instigator:攻撃した人のコントローラー(誰の攻撃か)
  • Damage Causer:実際に当たったもの(弾や武器)

Base Damage が 0 のときは何も起きません。「呼んでいるのに反応しない」ときはまずここを確認します。

受け取る側:Event AnyDamage

HP を持つアクターのイベントグラフで Event AnyDamage を置きます。Damage に受け取った量が入っているので、HP から引きます。

HP を 0 未満にしない

引いた結果は Clamp (Float) で 0〜最大HP に収めておくと、UI のゲージがマイナスになるような不具合を防げます。

0 になったら死亡処理

Clamp の後に <= 0 で分岐して、死亡処理(アニメーション、破棄、スコア加算など)に進めます。死亡処理を関数かカスタムイベントに分けておくと、落下死など別の原因からも呼べて便利です。

当たった位置や範囲が必要なとき

Apply Point Damage(当たった位置つき)や Apply Radial Damage(爆発などの範囲)もあります。受け取る側はそれぞれ Event PointDamage・Event RadialDamage で受けられますが、どの種類でも Event AnyDamage は呼ばれるので、HP の計算は AnyDamage にまとめておくと重複しません。