UE事件分发器

"一个开关触发 , 所有灯亮起"

在Unreal Engine中,事件调度器(Event Dispatcher)是一种强大的通信工具,允许不同Actor之间解耦交互。以下是关键点解析和实现步骤:


核心概念

  1. 跨Actor通信
    事件调度器允许一个Actor(触发者)通过广播事件,调用其他多个Actor(监听者)中绑定的函数,无需直接引用对方。例如,开关触发事件后,所有绑定的灯会亮起。

  2. 多播与解耦
    采用观察者模式,支持“一对多”或“多对多”通信。触发者无需知道哪些对象在监听,降低了代码耦合度。

  3. 参数传递
    事件调度器可定义参数类型(如整数、字符串、对象引用),在广播时传递数据给监听函数。


实现步骤(蓝图示例)

1. 定义事件调度器
  • 在触发者Actor中(如BP_Switch):

    1. 创建事件调度器变量(如OnSwitchActivated)。

    2. 设置参数(可选):右键调度器 → Add Parameter,定义参数类型。

2. 绑定事件到调度器
  • 在监听者Actor中(如BP_Light):

    1. 获取触发者引用:通过标签、场景查找或变量传递(如Get Actor of Class找到BP_Switch)。

    2. 绑定事件:拖出触发者引用 → Bind Event → 选择OnSwitchActivated

    3. 指定监听的函数:绑定到自定义事件(如ToggleLight)。

3. 触发事件
  • 在触发者Actor的蓝图中,调用Broadcast节点触发事件,并传递参数(如有)。

    • 例如:按下按键时,调用OnSwitchActivated.Broadcast(True)

4. 解绑事件(可选)
  • 在监听者Actor销毁时,调用Unbind节点,防止内存泄漏。

注意事项

  • 引用管理:确保监听者正确获取触发者的引用(如通过场景查找或动态传递)。

  • 内存安全:在Actor销毁时(如EndPlay)解绑事件,避免悬挂指针。

  • 性能优化:避免高频广播大量事件,尤其是在有数百个监听者时。


适用场景

  • 全局事件:如游戏状态变化(GameOver、LevelUp)。

  • 交互系统:如开关控制门、陷阱触发。

  • 动态对象:如生成敌人时通知UI更新计数。

通过事件调度器,Unreal Engine提供了灵活且高效的跨Actor通信方案,显著提升项目的模块化程度。

uE中的事件分发器可以帮助用户在程序中管理和处理事件。使用事件分发器可以将事件从一个对象递到另一个对象,实现对象之间的解耦。在uE中,事件分发器使用了观察者模式,当一个事件发生时,事件分发器会通知已注册的监听器并执行相应的操作。 使用uE事件分发器的方法如下: 1. 创建一个事件分发器对象。 2. 注册监听器对象,可以是任何实现了监听器接口的对象。 3. 在需要触发事件的地方,调用事件分发器的方法并递事件对象作为参数。 4. 事件分发器会自动通知已注册的监听器对象,并执行相应的操作。 示例代码如下: ```c++ // 定义一个事件类型 class MyEvent { public: int data; }; // 定义一个监听器接口 class MyListener { public: virtual void onEvent(MyEvent event) = 0; }; // 定义一个事件分发器 class MyEventDispatcher { private: std::vector<MyListener*> listeners; public: void registerListener(MyListener* listener) { listeners.push_back(listener); } void dispatchEvent(MyEvent event) { for (auto listener : listeners) { listener->onEvent(event); } } }; // 实现一个监听器 class MyEventListener : public MyListener { public: void onEvent(MyEvent event) override { std::cout << "Event data: " << event.data << std::endl; } }; // 使用事件分发器 int main() { MyEventDispatcher dispatcher; MyEventListener listener; dispatcher.registerListener(&listener); MyEvent event; event.data = 123; dispatcher.dispatchEvent(event); return 0; } ``` 在上面的示例代码中,我们创建了一个名为`MyEventDispatcher`的事件分发器,并实现了一个名为`MyEventListener`的监听器。我们使用`registerListener`方法将`MyEventListener`对象注册到事件分发器中,并使用`dispatchEvent`方法触发事件,并将`MyEvent`对象作为参数递给事件分发器。当事件被触发时,事件分发器会自动通知已注册的监听器对象,并执行相应的操作。在上面的示例代码中,我们实现了`MyEventListener`监听器的`onEvent`方法,当事件被触发时,会输出事件的数据到控制台上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UE星空

感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值