一、Event Any Damage 基础概念
1. 核心作用
当 Actor 被UGameplayStatics::ApplyDamage函数施加任意伤害时自动触发,统一处理所有伤害逻辑(近战、子弹、爆炸、环境持续掉血、溺水等),集中管理受伤、扣血、死亡、伤害类型区分,替代分散写多处受伤逻辑Epic Games。
2. 关键限制(必看,否则不触发)
- 仅服务器执行:单人游戏本地客户端 = 服务器;多人必须保证伤害在服务端调用 ApplyDamage,客户端不会触发此事件。
- 只响应 ApplyDamage:单纯碰撞 Hit 不会触发,必须手动调用 ApplyDamage 才会激活 Event Any Damage。
- 输出引脚说明:
| 引脚 | 含义 |
|—-|—-|
|Damage | 本次受到的伤害数值 (float)|
|Damage Type | 伤害类型对象(火焰 / 爆炸 / 子弹等自定义)|
|Instigated By | 造成伤害的控制器(玩家控制器 / AI 控制器)|
|Damage Causer | 造成伤害的 Actor(子弹、手雷、敌人本体)|
二、完整案例目标
实现第三人称角色伤害系统:
- 角色拥有生命值,被子弹击中触发 Event Any Damage 扣血
- 区分火焰 / 子弹两种伤害类型,播放不同受伤特效音效
- 血量≤0 触发死亡逻辑(禁用移动、播放死亡动画、销毁 Actor)
- 配套子弹蓝图调用 ApplyDamage 主动施加伤害
三、前置工程准备
- 打开 UE5,新建第三人称蓝图模板(Starter Content 勾选)
-
内容浏览器新建文件夹分类:
Blueprints/Player、Blueprints/Projectile、Blueprints/DamageTypes
四、步骤 1:创建自定义伤害类型(区分火焰 / 子弹伤害)
- 右键内容浏览器 → 蓝图类 → 搜索
DamageType,选中创建 - 复制两份,分别命名:
DT_Bullet(子弹伤害)、DT_Fire(火焰伤害) - 双击打开
DT_Bullet,蓝图类设置勾选Blueprint Type(允许蓝图转换判断),保存编译 DT_Fire做相同设置,两种伤害类型区分逻辑用
五、步骤 2:角色蓝图配置(接收伤害主体,核心 Event Any Damage)
打开自带
BP_ThirdPersonCharacter蓝图,分变量创建、Event Any Damage 逻辑编写两部分。5.1 创建角色生命值变量(我的变量面板)
- 添加浮点变量:
MaxHP:默认 100,可编辑实例、生成时公开CurrentHP:默认 100,可编辑实例、生成时公开
- 添加布尔变量:
bIsDead:默认 false,标记是否死亡
- 添加引用变量(粒子 / 音效,可选):
HitEffect_Bullet:粒子系统,子弹受击特效HitEffect_Fire:粒子系统,火焰灼烧特效
- 编译保存变量。
5.2 添加 Event Any Damage 事件并编写完整受伤逻辑
- 切换到事件图表,空白处右键搜索:
Event Any Damage,点击添加红色事件节点 - 完整蓝图连线逻辑分步搭建:
分支 1:死亡阻断(死亡后不再扣血)
- 从
bIsDead拖出 → Branch 分支 - Event Any Damage 执行引脚 → 连接 Branch「False」(活着才处理伤害,True 直接跳过)
分支 2:扣减生命值
- 拉出
CurrentHP→ 减法 Subtract - Subtract A=CurrentHP,B=Event Any Damage 的 Damage 引脚
- Subtract 输出 → Set CurrentHP(更新当前血量)
分支 3:判断伤害类型,播放对应特效音效
- Event Any Damage 的 Damage Type 引脚 → 拉出两个 Cast To 节点:
- Cast To DT_Bullet
- Cast To DT_Fire
- Cast 成功(Success)分别生成对应粒子:
- Spawn Emitter at Location:Location=Get Actor Location,粒子引用绑定 HitEffect_Bullet/Fire
分支 4:判断血量是否归零,触发死亡
- Set CurrentHP 输出执行线 → 拉出
CurrentHP→ Compare Float ≤,对比值填 0 - 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 蓝图
- 右键蓝图类 → Actor,命名
BP_Projectile_Bullet - 添加组件:
- Sphere Collision(碰撞球体,碰撞预设:Projectile)
- StaticMesh(小球网格作为子弹模型)
- Projectile Movement(投射物移动组件,速度 1500)
6.2 碰撞触发 ApplyDamage(关键:只有调用此函数才会触发角色 Event Any Damage)
- 事件图表添加
Event On Component Hit(碰撞触发) - Hit 事件逻辑:
- Break Hit Result,取出 Hit Actor(被击中目标)
- 添加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(子弹自身)
- Apply Damage 执行完成 → Destroy Actor(子弹击中后销毁)
关键说明
子弹碰撞只是检测,Apply Damage 才是触发角色 Event Any Damage 的桥梁,不调用该函数角色不会收到伤害事件。
七、步骤 4:玩家发射子弹(绑定鼠标左键)
回到
BP_ThirdPersonCharacter事件图表:- 添加
Event Input Left Mouse Click(左键射击) - 执行线连接Spawn Actor from Class,Class 选 BP_Projectile_Bullet
- Spawn 位置:Get Camera Location,旋转:Get Camera Rotation
- 编译保存蓝图。
八、完整测试操作步骤
- 所有蓝图依次点击Compile 编译 → Save 保存
- 将 BP_ThirdPersonCharacter 拖入关卡
- 点击编辑器顶部Play运行游戏
- 鼠标左键发射子弹击中自身 / 蓝图角色,现象:
- 触发 Event Any Damage,CurrentHP 从 100 持续扣 20 / 发
- 击中播放子弹受伤粒子特效
- 5 发子弹后 HP=0,角色禁用移动、播放死亡动画、3 秒后消失
九、多人网络同步重要规则(必看,多人踩坑点)
- Event Any Damage仅服务端触发,所有扣血、死亡逻辑必须写在此事件内,不要在客户端处理血量。
- 血量变量
CurrentHP、MaxHP勾选Replicated(复制),保证客户端同步血条显示。 - ApplyDamage 必须在服务端执行:
- 射击逻辑添加Switch Has Authority,只有 Authority(服务端)执行 Spawn 子弹 + ApplyDamage。
- 受伤粒子、UI 血条更新需要做客户端 RPC,服务端触发伤害后调用多播 RPC 同步视觉效果。
十、常见不触发 Event Any Damage 排错清单
- ❌ 只做碰撞 OnHit,没调用 ApplyDamage → ✅ 必须添加 ApplyDamage 函数
- ❌ 多人游戏在客户端调用 ApplyDamage → ✅ 仅服务端执行伤害逻辑
- ❌ DamageType 没有勾选 Blueprint Type → ✅ 伤害类型蓝图类开启 Blueprint Type
- ❌ 目标 Actor(角色)没有添加 Event Any Damage 节点 → ✅ 在受伤主体蓝图添加事件
- ❌ 死亡后没有 Branch 阻断,重复扣血 → ✅ 开头用 bIsDead 分支跳过死亡角色
- ❌ ApplyDamage 的 Damaged Actor 引脚为空 → ✅ 正确绑定 Hit Actor 目标
十一、拓展用法(环境持续伤害:火焰区域)
- 创建体积碰撞 Box Trigger,重叠事件 Begin Overlap
- 开启循环 Timer,每 0.5 秒调用一次 ApplyDamage,伤害值 5,DamageType 选 DT_Fire
- 角色进入火焰区域持续掉血,Event Any Damage 统一接收火焰伤害,和子弹伤害区分特效逻辑。
感谢您的来访,获取更多精彩文章请收藏本站。
THE END

















暂无评论内容