虚幻引擎 Create Event Dispatcher 节点

一、核心概念

Event Dispatcher(事件分发器):蓝图内的多播委托,实现一对多解耦通信
  • 发送方(事件源):创建分发器,调用调用(Broadcast)广播事件 + 传参
  • 接收方(监听者):拿到发送方引用 → 绑定事件,事件触发后执行自定义逻辑
  • 优势:发送方不需要知道有哪些对象监听,低耦合、易扩展,支持 Actor、UI、关卡蓝图互相通信

二、本次完整案例目标

  1. 玩家角色BP_Player创建分发器OnTakeDamage,受伤时广播当前血量、伤害值
  2. 监听对象 1:UI 血条W_HUD,收到事件自动更新血条文本 / 进度条
  3. 监听对象 2:场景灯 ActorBP_Light,玩家受伤时灯光闪烁变红
  4. 监听对象 3:关卡蓝图,受伤时打印日志 + 生成爆炸特效
  5. 覆盖:创建分发器、添加参数、广播、多对象绑定、解绑、编辑器测试全流程

三、前置准备(UE5 标准第三人称模板)

  1. 打开 UE5 → 新建项目 → 游戏 → 第三人称(蓝图),创建项目
  2. 内容浏览器右键 → 蓝图类:
    • BP_Light(Actor,放场景做受伤闪烁灯光)
  3. 右键 → 用户控件:W_HUD(UI 血条界面)

四、步骤 1:在发送方 BP_Player 创建事件分发器(Create Event Dispatcher)

4.1 新建分发器并命名

  1. 打开BP_ThirdPersonCharacter(重命名为BP_Player)蓝图编辑器
  2. 左侧【我的蓝图】面板 → 找到事件分发器分类 → 点击 + 添加新事件分发器
  3. 命名:OnTakeDamage(规范命名:On + 事件行为)

4.2 给分发器添加传递参数(广播时传给所有监听者)

  1. 选中OnTakeDamage,右侧【细节】面板下滑到输入
  2. 点击+ 新建输入,添加 2 个参数:
    表格
    参数名称 类型 作用
    CurrentHP 浮点型 Float 当前剩余血量
    DamageValue 浮点型 Float 本次受到的伤害
  3. 勾选【可编辑】,可设置提示文本,编译保存

4.3 制作受伤逻辑,调用分发器广播(Broadcast)

  1. 切换到【事件图表】
  2. 新建浮点变量HP,默认值100,勾选可编辑实例
  3. 实现按键 F 扣血逻辑:
    • 右键搜索F 按键事件(Pressed 按下)
    • 拖出HP变量 → HP - 浮点(10)SET HP
    • 左侧【我的蓝图】找到OnTakeDamage,拖拽到图表 → 选择调用
    • 连线:F 按下 → SET HP → 调用 OnTakeDamage
    • 给分发器参数赋值:CurrentHP=HPDamageValue=10
完整逻辑:按 F 扣 10 血,同时广播血量、伤害给所有监听对象

五、步骤 2:监听者 1——UI 血条 W_HUD 绑定分发器(Actor→UI 通信)

5.1 制作 UI 界面

    • 文本 Text(命名Text_HP,显示数字血量)
    • 进度条 ProgressBar(命名Progress_HP
      打开W_HUD(用户控件),【控件蓝图】面板拖入:
  1. 【我的蓝图】新建变量:
    • PlayerRef 类型:BP_Player 对象引用,勾选可编辑实例

5.2 在 Event Construct 中绑定分发器

  1. 切换到 UI【事件图表】,默认自带Event Construct(UI 创建时执行)
  2. PlayerRef拖出引线 → 搜索:绑定事件到 On Take Damage
    • 节点名称:Bind Event to OnTakeDamage
  3. 该节点会自动生成自定义事件OnTakeDamage_Event(接收分发器两个参数)
  4. 绑定逻辑连线:
    • Event Construct → Bind Event to OnTakeDamage
  5. 实现收到事件后的更新逻辑:
    • OnTakeDamage_Event拖出:
      1. 设置 Text_HP 文本:拼接字符串"血量:"+CurrentHP
      2. 设置 Progress_HP 进度:CurrentHP / 100(最大血量 100)
  6. 编译保存 UI

5.3 在玩家蓝图中挂载 UI

回到BP_Player事件图表,Event BeginPlay后添加:
  • 创建控件 W_HUD → 添加到视口
  • 把自身(Self)赋值给 UI 的PlayerRef变量

六、步骤 3:监听者 2—— 场景 Actor BP_Light 绑定分发器(Actor 互传)

6.1 BP_Light 基础搭建

  1. 打开BP_Light,添加【点光源 Point Light】组件
  2. 新建变量TargetPlayerBP_Player 对象引用,可编辑实例(关卡里手动指定玩家)

6.2 BeginPlay 绑定事件

  1. 事件图表Event BeginPlay
  2. TargetPlayer拖出 → 绑定事件到 On Take Damage,生成OnTakeDamage_Event
  3. 受伤闪烁逻辑:
    • OnTakeDamage_Event → 分支判断DamageValue > 0
    • 点光源设置颜色:红色(RGB 1,0,0)
    • 延迟 0.3 秒 → 恢复白色灯光
  4. 编译保存

6.3 关卡内配置

  1. 把 BP_Player、BP_Light 拖入关卡
  2. 选中 BP_Light,右侧细节面板 → TargetPlayer 选择场景里的 BP_Player

七、步骤 4:监听者 3—— 关卡蓝图绑定分发器(全局关卡监听)

  1. 顶部菜单【蓝图】→【打开关卡蓝图】
  2. 添加Event BeginPlay节点
  3. 右键搜索获取玩家角色 → 转换到 BP_Player(Cast To BP_Player)
  4. 从转换成功引脚拖出 → 绑定事件到 On Take Damage,生成事件
  5. 事件内逻辑:
    • 打印字符串:玩家受伤,当前血量:{CurrentHP},伤害:{DamageValue}
    • 在玩家位置生成爆炸特效(Spawn Actor from Class)

八、关键配套操作:解绑事件(防止内存泄漏 / 重复触发)

所有绑定对象销毁时必须解绑,否则会出现空指针报错:
  1. 在监听者(UI/Actor)添加Event Destroyed事件
  2. 从玩家引用拖出 → 解绑事件从 On Take Damage
  3. 连线:Event Destroyed → 解绑节点
例:BP_Light 的 Event Destroyed 执行解绑;UI 关闭时自动执行解绑

九、编辑器快速测试技巧(Call In Editor)

  1. 回到 BP_Player,选中分发器OnTakeDamage
  2. 右侧细节面板勾选 Call In Editor
  3. 无需运行游戏,直接在蓝图编辑器右键调用 OnTakeDamage,手动输入参数测试所有监听逻辑

十、完整运行流程总结

  1. 游戏启动:Event BeginPlay,UI、灯光、关卡蓝图全部绑定玩家分发器
  2. 玩家按 F 扣血 → SET HP → 调用OnTakeDamage广播(传递 CurrentHP、DamageValue)
  3. 所有绑定对象同步收到事件:
    • UI:实时刷新血条数字 + 进度条
    • 场景灯光:变红闪烁 0.3 秒
    • 关卡蓝图:打印日志 + 生成爆炸特效
  4. 对象销毁时自动解绑事件,避免报错

十一、常见问题与避坑

  1. 绑定后无响应
    • 检查是否编译蓝图、是否正确赋值玩家引用(Is Valid 校验)
    • 分发器参数数量 / 类型必须和绑定事件完全一致
  2. 多次绑定导致事件重复执行
    • 只在 BeginPlay 绑定,Destroyed 解绑;不要在 Tick 里绑定
  3. 空指针崩溃
    • 绑定前用Is Valid判断玩家引用是否存在
    • 所有监听对象销毁时执行解绑
  4. UI 接收不到事件
    • 确认 UI 的 PlayerRef 正确赋值为玩家 Self,不要留空

十二、常用核心节点汇总

  1. Create Event Dispatcher:我的蓝图面板 + 号新建(无单独右键节点,在面板创建)
  2. 调用 分发器名:广播事件,向外传递参数
  3. 绑定事件到 分发器名:订阅事件,生成接收参数的自定义事件
  4. 解绑事件从 分发器名:取消订阅,释放委托
  5. Is Valid:校验 Actor 引用是否有效,防止空指针

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

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

昵称

取消
昵称表情代码图片

    暂无评论内容