一、核心概念
Event Dispatcher(事件分发器):蓝图内的多播委托,实现一对多解耦通信。
- 发送方(事件源):创建分发器,调用
调用(Broadcast)广播事件 + 传参 - 接收方(监听者):拿到发送方引用 →
绑定事件,事件触发后执行自定义逻辑 - 优势:发送方不需要知道有哪些对象监听,低耦合、易扩展,支持 Actor、UI、关卡蓝图互相通信
二、本次完整案例目标
- 玩家角色
BP_Player创建分发器OnTakeDamage,受伤时广播当前血量、伤害值 - 监听对象 1:UI 血条
W_HUD,收到事件自动更新血条文本 / 进度条 - 监听对象 2:场景灯 Actor
BP_Light,玩家受伤时灯光闪烁变红 - 监听对象 3:关卡蓝图,受伤时打印日志 + 生成爆炸特效
- 覆盖:创建分发器、添加参数、广播、多对象绑定、解绑、编辑器测试全流程
三、前置准备(UE5 标准第三人称模板)
- 打开 UE5 → 新建项目 → 游戏 → 第三人称(蓝图),创建项目
- 内容浏览器右键 → 蓝图类:
BP_Light(Actor,放场景做受伤闪烁灯光)
- 右键 → 用户控件:
W_HUD(UI 血条界面)
四、步骤 1:在发送方 BP_Player 创建事件分发器(Create Event Dispatcher)
4.1 新建分发器并命名
-
打开
BP_ThirdPersonCharacter(重命名为BP_Player)蓝图编辑器 - 左侧【我的蓝图】面板 → 找到事件分发器分类 → 点击
+ 添加新事件分发器 -
命名:
OnTakeDamage(规范命名:On + 事件行为)
4.2 给分发器添加传递参数(广播时传给所有监听者)
- 选中
OnTakeDamage,右侧【细节】面板下滑到输入 - 点击
+ 新建输入,添加 2 个参数:表格参数名称 类型 作用 CurrentHP 浮点型 Float 当前剩余血量 DamageValue 浮点型 Float 本次受到的伤害 - 勾选【可编辑】,可设置提示文本,编译保存
4.3 制作受伤逻辑,调用分发器广播(Broadcast)
- 切换到【事件图表】
- 新建浮点变量
HP,默认值100,勾选可编辑实例 - 实现按键 F 扣血逻辑:
-
右键搜索
F 按键事件(Pressed 按下) -
拖出
HP变量 →HP - 浮点(10)→SET HP - 左侧【我的蓝图】找到
OnTakeDamage,拖拽到图表 → 选择调用 -
连线:F 按下 → SET HP → 调用 OnTakeDamage
-
给分发器参数赋值:
CurrentHP=HP,DamageValue=10
-
完整逻辑:按 F 扣 10 血,同时广播血量、伤害给所有监听对象
五、步骤 2:监听者 1——UI 血条 W_HUD 绑定分发器(Actor→UI 通信)
5.1 制作 UI 界面
-
- 文本 Text(命名
Text_HP,显示数字血量) - 进度条 ProgressBar(命名
Progress_HP)打开W_HUD(用户控件),【控件蓝图】面板拖入:
- 文本 Text(命名
-
【我的蓝图】新建变量:
PlayerRef类型:BP_Player对象引用,勾选可编辑实例
5.2 在 Event Construct 中绑定分发器
- 切换到 UI【事件图表】,默认自带
Event Construct(UI 创建时执行) - 从
PlayerRef拖出引线 → 搜索:绑定事件到 On Take Damage- 节点名称:
Bind Event to OnTakeDamage
- 节点名称:
- 该节点会自动生成自定义事件
OnTakeDamage_Event(接收分发器两个参数) - 绑定逻辑连线:
- Event Construct → Bind Event to OnTakeDamage
- 实现收到事件后的更新逻辑:
- 从
OnTakeDamage_Event拖出:- 设置 Text_HP 文本:拼接字符串
"血量:"+CurrentHP - 设置 Progress_HP 进度:
CurrentHP / 100(最大血量 100)
- 设置 Text_HP 文本:拼接字符串
- 从
- 编译保存 UI
5.3 在玩家蓝图中挂载 UI
回到
BP_Player事件图表,Event BeginPlay后添加:- 创建控件 W_HUD → 添加到视口
- 把自身(Self)赋值给 UI 的
PlayerRef变量
六、步骤 3:监听者 2—— 场景 Actor BP_Light 绑定分发器(Actor 互传)
6.1 BP_Light 基础搭建
- 打开
BP_Light,添加【点光源 Point Light】组件 - 新建变量
TargetPlayer:BP_Player对象引用,可编辑实例(关卡里手动指定玩家)
6.2 BeginPlay 绑定事件
- 事件图表
Event BeginPlay - 从
TargetPlayer拖出 →绑定事件到 On Take Damage,生成OnTakeDamage_Event - 受伤闪烁逻辑:
- OnTakeDamage_Event → 分支判断
DamageValue > 0 - 点光源设置颜色:红色(RGB 1,0,0)
- 延迟 0.3 秒 → 恢复白色灯光
- OnTakeDamage_Event → 分支判断
- 编译保存
6.3 关卡内配置
- 把 BP_Player、BP_Light 拖入关卡
- 选中 BP_Light,右侧细节面板 → TargetPlayer 选择场景里的 BP_Player
七、步骤 4:监听者 3—— 关卡蓝图绑定分发器(全局关卡监听)
- 顶部菜单【蓝图】→【打开关卡蓝图】
- 添加
Event BeginPlay节点 - 右键搜索
获取玩家角色→ 转换到 BP_Player(Cast To BP_Player) - 从转换成功引脚拖出 →
绑定事件到 On Take Damage,生成事件 - 事件内逻辑:
- 打印字符串:
玩家受伤,当前血量:{CurrentHP},伤害:{DamageValue} - 在玩家位置生成爆炸特效(Spawn Actor from Class)
- 打印字符串:
八、关键配套操作:解绑事件(防止内存泄漏 / 重复触发)
所有绑定对象销毁时必须解绑,否则会出现空指针报错:
- 在监听者(UI/Actor)添加
Event Destroyed事件 - 从玩家引用拖出 →
解绑事件从 On Take Damage - 连线:Event Destroyed → 解绑节点
例:BP_Light 的 Event Destroyed 执行解绑;UI 关闭时自动执行解绑
九、编辑器快速测试技巧(Call In Editor)
- 回到 BP_Player,选中分发器
OnTakeDamage - 右侧细节面板勾选 Call In Editor
- 无需运行游戏,直接在蓝图编辑器右键
调用 OnTakeDamage,手动输入参数测试所有监听逻辑
十、完整运行流程总结
- 游戏启动:Event BeginPlay,UI、灯光、关卡蓝图全部绑定玩家分发器
- 玩家按 F 扣血 → SET HP → 调用
OnTakeDamage广播(传递 CurrentHP、DamageValue) - 所有绑定对象同步收到事件:
- UI:实时刷新血条数字 + 进度条
- 场景灯光:变红闪烁 0.3 秒
- 关卡蓝图:打印日志 + 生成爆炸特效
- 对象销毁时自动解绑事件,避免报错
十一、常见问题与避坑
- 绑定后无响应
- 检查是否编译蓝图、是否正确赋值玩家引用(Is Valid 校验)
- 分发器参数数量 / 类型必须和绑定事件完全一致
- 多次绑定导致事件重复执行
- 只在 BeginPlay 绑定,Destroyed 解绑;不要在 Tick 里绑定
- 空指针崩溃
- 绑定前用
Is Valid判断玩家引用是否存在 - 所有监听对象销毁时执行解绑
- 绑定前用
- UI 接收不到事件
- 确认 UI 的 PlayerRef 正确赋值为玩家 Self,不要留空
十二、常用核心节点汇总
Create Event Dispatcher:我的蓝图面板 + 号新建(无单独右键节点,在面板创建)调用 分发器名:广播事件,向外传递参数绑定事件到 分发器名:订阅事件,生成接收参数的自定义事件解绑事件从 分发器名:取消订阅,释放委托Is Valid:校验 Actor 引用是否有效,防止空指针
感谢您的来访,获取更多精彩文章请收藏本站。
THE END

















暂无评论内容