19.

UE5のEvent Any Damageとは|ダメージ処理の受け取りとApply Damage

編集

Event Any Damageとは

Event Any Damageは、Unreal Engine 5(UE5)でアクターが何らかのダメージを受けた瞬間に発火する、ダメージ受信用のイベントです。Apply Damage系のノードによってそのアクターへダメージが与えられると呼び出され、受けたダメージ量や与えた相手などの情報を受け取って、HPの減算や撃破処理といったゲームロジックにつなげられます。Blueprintのイベントグラフ上で右クリックメニューから追加でき、内部的にはC++のAActor::TakeDamage()に対応しています。

この記事の要点
  • Event Any Damageは、アクターがダメージを受けたときに発火するイベント。
  • 発火の起点はApply Damageなどのダメージ適用ノード。攻撃側がダメージを「与える」と、受け側で「発火」する。
  • 受け取れる情報は、Damage(量)Damage Type(種類)Instigated By(与えた側のコントローラー)Damage Causer(実際に与えたアクター)
  • Event Point Damage(点ダメージ)やEvent Radial Damage(範囲ダメージ)も、最終的にこのAny Damageを呼び出す傾向がある。種類を問わず一括で受けたい場合に向く。
  • Can Be Damagedが無効だとダメージ自体が通らず発火しないなど、いくつかの落とし穴がある。

何が起きたときに発火するのか

Event Any Damageは、対象アクターに対してApply Damage(C++ではUGameplayStatics::ApplyDamage)などのダメージ適用処理が実行されたときに、その受け側のアクターで発火します。たとえば、敵キャラクターがプレイヤーの攻撃でダメージを受けたり、爆発や落下のダメージを受けたりした瞬間に呼び出されます。

重要なのは、ダメージは「受け側が自分で発生させる」のではなく、攻撃側(与える側)がApply Damageを実行することで受け側に届くという流れになっている点です。Event Any Damageはその届いたダメージを受け取る入口にあたります。

Event Any Damageが提供する情報

このイベントの出力ピンからは、ダメージに関する次の情報を取得できます。これらを使って「誰が」「何で」「どれだけ」ダメージを与えたかを判定できます。

  • Damage(float):受けたダメージの量。HPからの減算などに使います。
  • Damage Type(Damage Type):ダメージの種類を表すクラス。炎・毒・物理などをDamage Typeのサブクラスで区別し、処理を分岐できます。
  • Instigated By(Controller):ダメージを与えた側のコントローラー。多くの場合、攻撃したプレイヤーやAIのコントローラーが入ります。
  • Damage Causer(Actor):実際にダメージを与えたアクター。弾(プロジェクタイル)や手榴弾、罠など、当たった物そのものが入ります。

Instigated ByとDamage Causerは混同しやすい組み合わせです。たとえばプレイヤーが撃った弾が当たった場合、Instigated Byは「撃ったプレイヤーのコントローラー」、Damage Causerは「弾アクター」になります。スコア加算やキルログ表示などで「誰が倒したか」を知りたいときはInstigated By側を、ヒットエフェクトの出し分けなど「何に当たったか」を知りたいときはDamage Causer側を参照するのが一般的です。

ダメージの与え方(Apply Damage)

Event Any Damageを発火させるには、攻撃側でApply Damageノードを実行します。Apply Damageには主に次の入力があります。

  • Damaged Actor:ダメージを与える対象アクター。
  • Base Damage:与えるダメージ量。
  • Event Instigator:与える側のコントローラー。受け側のInstigated Byに渡ります。
  • Damage Causer:実際にダメージを与えるアクター。受け側のDamage Causerに渡ります。
  • Damage Type Class:ダメージの種類を指定するクラス。受け側のDamage Typeに渡ります。

近接攻撃なら武器のコリジョン判定でヒットを検知した瞬間に、遠距離攻撃ならLine TraceやプロジェクタイルのHitイベントでヒット相手を特定した瞬間に、それぞれApply Damageを呼び出すのが定番です。Apply Damageを実行した対象アクター側にEvent Any Damageが実装されていれば、そこで処理が走ります。

Apply Damageの戻り値には、実際に適用されたダメージ量が返ります。受け側で防御力による軽減や上限処理を行った場合、与える側はこの戻り値を見ることで「実際に何ダメージ通ったか」を把握できます。ダメージ表示(フローティングダメージ)やコンボ判定などで活用される値です。なお、与える側と受け側で同じダメージ計算を二重に書かないよう、HPの増減はあくまで受け側のEvent Any Damage内に集約するのが管理しやすい設計になります。

Any Damage・Point Damage・Radial Damageの違い

UE5のダメージ受信イベントには、Event Any DamageのほかにEvent Point DamageEvent Radial Damageがあります。それぞれ対応する適用関数と取得できる情報が異なります。次の表で整理します。

受信イベント 対応する適用ノード 主な用途 得られる追加情報
Event Any Damage Apply Damage 種類を問わずダメージ全般を一括で受け取る 追加情報なし(量・種類・与えた相手のみ)
Event Point Damage Apply Point Damage 弾が当たった点など、1点・特定方向からのダメージ ヒット位置、ヒット方向、当たったボーン名などのHit情報
Event Radial Damage Apply Radial Damage 爆発など、一定半径内の複数対象への範囲ダメージ ダメージの中心位置や距離減衰に関する情報

ポイントとして、Apply Point DamageApply Radial Damageで与えたダメージは、対応する個別イベントに加えてEvent Any Damageも呼び出される傾向があります。そのため、ヒット位置などの詳細が不要で「ダメージを受けた」という事実だけを一括で扱いたい場合はAny Damageを、ヒット位置や方向で演出を変えたい場合はPoint/Radialを使い分けると効率的です。これらの呼び出し関係はバージョンや実装により挙動が変わる可能性があるため、厳密な動作は使用中のエンジンバージョンで確認することをおすすめします。

使い方の例:ダメージを受けてHPを減らす

最も基本的な使い方は、受けたDamageをHP変数から差し引き、HPが尽きたら撃破処理を行うものです。次のような流れで組めます。

  1. ダメージを受けるアクターのBlueprintに、float型のHealth変数を作成し、初期値(例:100)を設定する。
  2. イベントグラフにEvent Any Damageを追加する。
  3. 現在のHealthから出力ピンのDamageを引き、結果をHealthへ代入(Set)する。
  4. BranchでHealthが0以下かどうかを判定する。
  5. 0以下ならDestroy Actorなどで撃破処理を行い、撃破エフェクトやサウンドを再生する。

応用として、出力ピンのDamage Typeを判定して炎なら継続ダメージを付与する、シールド中はダメージを無効化する、被弾時にヒットリアクションのアニメーションを再生する、といった分岐も同じイベント内で実装できます。また、Instigated Byを使って「最後に自分を攻撃した相手」を変数に保存しておけば、撃破時のスコア加算やキルログ表示、リベンジ対象の記録などにも応用できます。プレイヤーキャラクターであれば、HP変数をHUDのプログレスバーにバインドしておくことで、被弾と同時に体力ゲージが減る表現も実現できます。

C++のTakeDamageとの対応

Event Any Damageは、C++の仮想関数AActor::TakeDamage()に対応しています。シグネチャはおおむね次のとおりで、Blueprintの各出力ピンと素直に対応しています。

virtual float TakeDamage(float DamageAmount, const FDamageEvent& DamageEvent, AController* EventInstigator, AActor* DamageCauser);

C++側でAny Damageに相当する処理を受け取りたい場合は、TakeDamageをオーバーライドするか、OnTakeAnyDamageデリゲートにイベントをバインドします。BlueprintのEvent Any Damageは、このOnTakeAnyDamageに相当するものをノードとして扱えるようにしたものと考えると理解しやすいです。点ダメージ・範囲ダメージにはそれぞれOnTakePointDamageOnTakeRadialDamageといった対応物があります。

つまずきやすい落とし穴

落とし穴 内容と対処
Can Be Damagedが無効 アクターのCan Be Damaged(CanBeDamaged)が無効だと、ダメージ自体が通らずイベントが発火しません。発火しないときはまずこの設定を確認します。実行時にSet Can Be Damagedで切り替えている場合も要注意です。
与える側の設定不足 Apply DamageのDamaged Actorが正しい対象を指していない、対象に当たっていない、といったケースでは当然発火しません。受け側だけでなく、与える側のApply Damageが実際に実行されているかを確認します。
ダメージ0で素通り Base Damageが0だと、内部の処理によってはイベントが呼ばれなかったり、呼ばれてもDamageが0で意味のある処理にならない場合があります。最小ダメージの扱いは仕様に依存するため、HP計算側でも0ダメージを想定しておくと安全です。
Damage Type未指定の前提 Damage Type Classを指定せずに与えると、受け側のDamage Typeが既定値になります。種類で分岐する処理を組むなら、与える側でDamage Typeを必ず設定します。

よくある質問(FAQ)

Q. Event Any DamageとEvent Point Damageを同じアクターに両方置いてもよいですか。
A. 両方を配置できます。Apply Point Damageで与えた場合、Point DamageとAny Damageの双方が呼ばれる傾向があるため、HP減算をどちらか一方にまとめないと二重に減ってしまうことがあります。役割分担(演出はPoint、HP管理はAnyなど)を明確にしておくとよいでしょう。実装をシンプルに保ちたい場合は、HPの増減はEvent Any Damageに一本化するのが無難です。

Q. 自分のアクターから自分にダメージを与えることはできますか。
A. Apply DamageのDamaged Actorに自分自身を指定すれば可能です。落下ダメージや自爆などで利用されます。Instigated ByやDamage Causerに自分を渡すかどうかは、後続のスコア処理などに影響するため用途に応じて設定します。

Q. ダメージを受けても発火しません。何を見ればよいですか。
A. まず受け側のCan Be Damagedが有効かを確認します。次に、与える側でApply Damageが実際に実行され、正しいターゲットを指しているかをログやブレークポイントで確認します。コリジョンやチャンネル設定でヒット自体が成立していないケースも多いため、ヒット判定から順にたどると原因を切り分けやすくなります。範囲ダメージの場合は、爆発の中心や半径、遮蔽判定に使うチャンネルの設定によって対象に届いていないこともあるため、適用ノード側のパラメータもあわせて見直すとよいでしょう。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Event BeginPlay
  2. Event ActorBeginOverlap
  3. Event Tick
  4. on component begin overlap
  5. On Component Hit
  6. CameraBoom(Spring Arm)
  7. Get Player Character
  8. Nav Mesh Bounds Volume
  9. AI MoveTo
  10. Pawn
  11. Create Render Target 2D
  12. Take High Res Screenshotノード
  13. Sphere Reflection Capture
  14. Event Tickノード
  15. ウィジェットのキャンバスパネル
  16. DefaultSceneRoot
  17. FloatingPawnMovement
  18. Set World Rotation
  19. Event Any Damage
  20. Set World Rotation
  21. VInterp To
  22. Get Socket Transform

最近更新/作成されたページ