"一个开关触发 , 所有灯亮起"
在Unreal Engine中,事件调度器(Event Dispatcher)是一种强大的通信工具,允许不同Actor之间解耦交互。以下是关键点解析和实现步骤:
核心概念
-
跨Actor通信
事件调度器允许一个Actor(触发者)通过广播事件,调用其他多个Actor(监听者)中绑定的函数,无需直接引用对方。例如,开关触发事件后,所有绑定的灯会亮起。 -
多播与解耦
采用观察者模式,支持“一对多”或“多对多”通信。触发者无需知道哪些对象在监听,降低了代码耦合度。 -
参数传递
事件调度器可定义参数类型(如整数、字符串、对象引用),在广播时传递数据给监听函数。
实现步骤(蓝图示例)
1. 定义事件调度器
-
在触发者Actor中(如
BP_Switch
):-
创建事件调度器变量(如
OnSwitchActivated
)。 -
设置参数(可选):右键调度器 → Add Parameter,定义参数类型。
-
2. 绑定事件到调度器
-
在监听者Actor中(如
BP_Light
):-
获取触发者引用:通过标签、场景查找或变量传递(如
Get Actor of Class
找到BP_Switch
)。 -
绑定事件:拖出触发者引用 → Bind Event → 选择
OnSwitchActivated
。 -
指定监听的函数:绑定到自定义事件(如
ToggleLight
)。
-
3. 触发事件
-
在触发者Actor的蓝图中,调用Broadcast节点触发事件,并传递参数(如有)。
-
例如:按下按键时,调用
OnSwitchActivated.Broadcast(True)
。
-
4. 解绑事件(可选)
-
在监听者Actor销毁时,调用Unbind节点,防止内存泄漏。
注意事项
-
引用管理:确保监听者正确获取触发者的引用(如通过场景查找或动态传递)。
-
内存安全:在Actor销毁时(如
EndPlay
)解绑事件,避免悬挂指针。 -
性能优化:避免高频广播大量事件,尤其是在有数百个监听者时。
适用场景
-
全局事件:如游戏状态变化(GameOver、LevelUp)。
-
交互系统:如开关控制门、陷阱触发。
-
动态对象:如生成敌人时通知UI更新计数。
通过事件调度器,Unreal Engine提供了灵活且高效的跨Actor通信方案,显著提升项目的模块化程度。