虚幻引擎 Event Any Damage 节点

一、Event Any Damage 基础概念

1. 核心作用

当 Actor 被UGameplayStatics::ApplyDamage函数施加任意伤害时自动触发,统一处理所有伤害逻辑(近战、子弹、爆炸、环境持续掉血、溺水等),集中管理受伤、扣血、死亡、伤害类型区分,替代分散写多处受伤逻辑Epic Games。

2. 关键限制(必看,否则不触发)

  1. 仅服务器执行:单人游戏本地客户端 = 服务器;多人必须保证伤害在服务端调用 ApplyDamage,客户端不会触发此事件。
  2. 只响应 ApplyDamage:单纯碰撞 Hit 不会触发,必须手动调用 ApplyDamage 才会激活 Event Any Damage。
  3. 输出引脚说明:

    | 引脚 | 含义 |

    |—-|—-|

    |Damage | 本次受到的伤害数值 (float)|

    |Damage Type | 伤害类型对象(火焰 / 爆炸 / 子弹等自定义)|

    |Instigated By | 造成伤害的控制器(玩家控制器 / AI 控制器)|

    |Damage Causer | 造成伤害的 Actor(子弹、手雷、敌人本体)|

二、完整案例目标

实现第三人称角色伤害系统:
  1. 角色拥有生命值,被子弹击中触发 Event Any Damage 扣血
  2. 区分火焰 / 子弹两种伤害类型,播放不同受伤特效音效
  3. 血量≤0 触发死亡逻辑(禁用移动、播放死亡动画、销毁 Actor)
  4. 配套子弹蓝图调用 ApplyDamage 主动施加伤害

三、前置工程准备

  1. 打开 UE5,新建第三人称蓝图模板(Starter Content 勾选)
  2. 内容浏览器新建文件夹分类:Blueprints/PlayerBlueprints/ProjectileBlueprints/DamageTypes

四、步骤 1:创建自定义伤害类型(区分火焰 / 子弹伤害)

  1. 右键内容浏览器 → 蓝图类 → 搜索DamageType,选中创建
  2. 复制两份,分别命名:DT_Bullet(子弹伤害)、DT_Fire(火焰伤害)
  3. 双击打开DT_Bullet,蓝图类设置勾选Blueprint Type(允许蓝图转换判断),保存编译
  4. DT_Fire做相同设置,两种伤害类型区分逻辑用

五、步骤 2:角色蓝图配置(接收伤害主体,核心 Event Any Damage)

打开自带BP_ThirdPersonCharacter蓝图,分变量创建Event Any Damage 逻辑编写两部分。

5.1 创建角色生命值变量(我的变量面板)

  1. 添加浮点变量:
    • MaxHP:默认 100,可编辑实例、生成时公开
    • CurrentHP:默认 100,可编辑实例、生成时公开
  2. 添加布尔变量:
    • bIsDead:默认 false,标记是否死亡
  3. 添加引用变量(粒子 / 音效,可选):
    • HitEffect_Bullet:粒子系统,子弹受击特效
    • HitEffect_Fire:粒子系统,火焰灼烧特效
  4. 编译保存变量。

5.2 添加 Event Any Damage 事件并编写完整受伤逻辑

  1. 切换到事件图表,空白处右键搜索:Event Any Damage,点击添加红色事件节点
  2. 完整蓝图连线逻辑分步搭建:

分支 1:死亡阻断(死亡后不再扣血)

  1. bIsDead拖出 → Branch 分支
  2. Event Any Damage 执行引脚 → 连接 Branch「False」(活着才处理伤害,True 直接跳过)

分支 2:扣减生命值

  1. 拉出CurrentHP减法 Subtract
  2. Subtract A=CurrentHP,B=Event Any Damage 的 Damage 引脚
  3. Subtract 输出 → Set CurrentHP(更新当前血量)

分支 3:判断伤害类型,播放对应特效音效

  1. Event Any Damage 的 Damage Type 引脚 → 拉出两个 Cast To 节点:
    • Cast To DT_Bullet
    • Cast To DT_Fire
  2. Cast 成功(Success)分别生成对应粒子:
    • Spawn Emitter at Location:Location=Get Actor Location,粒子引用绑定 HitEffect_Bullet/Fire

分支 4:判断血量是否归零,触发死亡

  1. Set CurrentHP 输出执行线 → 拉出CurrentHPCompare Float ≤,对比值填 0
  2. Compare True → 进入死亡逻辑:
    • Set bIsDead = True
    • Set Actor Hidden In Game(可选,隐藏角色)
    • Set Movement Mode = None(禁用移动)
    • Play Animation(死亡动画 Death 序列)
    • Delay 3 秒 → Destroy Actor(延迟销毁尸体)

完整逻辑流程图简化

plaintext
Event Any Damage
    └─ Branch(bIsDead)
         ├─ True → 无操作(死亡跳过)
         └─ False
              ├─ CurrentHP = CurrentHP - Damage
              ├─ 判断DamageType类型 → 生成对应受伤粒子音效
              └─ Branch(CurrentHP ≤ 0)
                   ├─ True:标记死亡、禁用移动、播死亡动画、延迟销毁
                   └─ False:仅受伤,无死亡

六、步骤 3:子弹蓝图(调用 ApplyDamage,主动给角色施加伤害)

6.1 创建子弹 Actor 蓝图

  1. 右键蓝图类 → Actor,命名BP_Projectile_Bullet
  2. 添加组件:
    • Sphere Collision(碰撞球体,碰撞预设:Projectile)
    • StaticMesh(小球网格作为子弹模型)
    • Projectile Movement(投射物移动组件,速度 1500)

6.2 碰撞触发 ApplyDamage(关键:只有调用此函数才会触发角色 Event Any Damage)

  1. 事件图表添加Event On Component Hit(碰撞触发)
  2. Hit 事件逻辑:
    1. Break Hit Result,取出 Hit Actor(被击中目标)
    2. 添加Apply Damage全局函数节点(搜索 UGameplayStatics Apply Damage)
      • Damaged Actor:Hit Actor(被打中的角色)
      • Base Damage:20(单次子弹伤害)
      • Damage Type Class:DT_Bullet(绑定子弹伤害类型)
      • Instigated By:Get Player Controller 0(伤害施加者控制器)
      • Damage Causer:Self(子弹自身)
    3. Apply Damage 执行完成 → Destroy Actor(子弹击中后销毁)

关键说明

子弹碰撞只是检测,Apply Damage 才是触发角色 Event Any Damage 的桥梁,不调用该函数角色不会收到伤害事件。

七、步骤 4:玩家发射子弹(绑定鼠标左键)

回到BP_ThirdPersonCharacter事件图表:
  1. 添加Event Input Left Mouse Click(左键射击)
  2. 执行线连接Spawn Actor from Class,Class 选 BP_Projectile_Bullet
  3. Spawn 位置:Get Camera Location,旋转:Get Camera Rotation
  4. 编译保存蓝图。

八、完整测试操作步骤

  1. 所有蓝图依次点击Compile 编译 → Save 保存
  2. 将 BP_ThirdPersonCharacter 拖入关卡
  3. 点击编辑器顶部Play运行游戏
  4. 鼠标左键发射子弹击中自身 / 蓝图角色,现象:
    1. 触发 Event Any Damage,CurrentHP 从 100 持续扣 20 / 发
    2. 击中播放子弹受伤粒子特效
    3. 5 发子弹后 HP=0,角色禁用移动、播放死亡动画、3 秒后消失

九、多人网络同步重要规则(必看,多人踩坑点)

  1. Event Any Damage仅服务端触发,所有扣血、死亡逻辑必须写在此事件内,不要在客户端处理血量。
  2. 血量变量CurrentHPMaxHP勾选Replicated(复制),保证客户端同步血条显示。
  3. ApplyDamage 必须在服务端执行
    • 射击逻辑添加Switch Has Authority,只有 Authority(服务端)执行 Spawn 子弹 + ApplyDamage。
  4. 受伤粒子、UI 血条更新需要做客户端 RPC,服务端触发伤害后调用多播 RPC 同步视觉效果。

十、常见不触发 Event Any Damage 排错清单

  1. ❌ 只做碰撞 OnHit,没调用 ApplyDamage → ✅ 必须添加 ApplyDamage 函数
  2. ❌ 多人游戏在客户端调用 ApplyDamage → ✅ 仅服务端执行伤害逻辑
  3. ❌ DamageType 没有勾选 Blueprint Type → ✅ 伤害类型蓝图类开启 Blueprint Type
  4. ❌ 目标 Actor(角色)没有添加 Event Any Damage 节点 → ✅ 在受伤主体蓝图添加事件
  5. ❌ 死亡后没有 Branch 阻断,重复扣血 → ✅ 开头用 bIsDead 分支跳过死亡角色
  6. ❌ ApplyDamage 的 Damaged Actor 引脚为空 → ✅ 正确绑定 Hit Actor 目标

十一、拓展用法(环境持续伤害:火焰区域)

  1. 创建体积碰撞 Box Trigger,重叠事件 Begin Overlap
  2. 开启循环 Timer,每 0.5 秒调用一次 ApplyDamage,伤害值 5,DamageType 选 DT_Fire
  3. 角色进入火焰区域持续掉血,Event Any Damage 统一接收火焰伤害,和子弹伤害区分特效逻辑。

感谢您的来访,获取更多精彩文章请收藏本站。

THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容