[UE C++]实现自己的事件分发机制
前言
UE当中有自己的事件分发机制实现方式。在蓝图中,通过左下角自带的事件分发器来实现。在UEC++中,可以通过委托(Delegate),将一个函数指针或成员函数指针绑定到一个特定的对象,并在需要时调用该函数或方法来实现事件分发。本文依照事件分发机制的核心理念,创建一个自己的事件分发器。
正文
首先核心框架由这两类构成:EventManager、EventInterface。在EventManager中,管理着所有的订阅者以及订阅的事件。
订阅事件全局变量
利用Map存储事件及其对应所有订阅者,因为Map可以将任何基本类型(包括STL容器)映射到任何基本类型。因此键用FString存储事件名,值用TArray<UObject*>存储其订阅者。
回调函数接口
用BlueprintNativeEvent修饰,是回调函数既可以在C++中实现,也可在蓝图中实现。
核心函数方法
一、AddEventListener
AddEventListener用于添加订阅者,函数接收两个参数,一个是订阅事件的名称,另一个是订阅者的指针。首先应当对参数进行安全校验,判断订阅者是否为空,以及是否被垃圾回收机制标记为无效,其次还应当实现订阅的接口函数。
在通过校验后,在AllListener中查找是否已有该事件,若有则直接在其下添加该订阅者,否则重新添加一个该事件的Array存储订阅者。
二、RemoveEventListener
RemoveEventListener用于删除事件中的订阅者。由于Remove不需要判别订阅者的有效性,因此只需要对事件名做判断即可。
三、DispatchEvent
函数接收两个参数,第一个是事件名,第二个是事件需要传入的数据,以UObject作为参数则方便转换为实际参数类型。先寻找是否有该事件并取出其中的订阅者序列,若是没有则直接返回报错信息。
若是有该事件,首先对订阅者序列进行遍历,检查是否有已经被垃圾回收标记为无效的对象,有则将其删除。然后正常进行事件分发,利用UFunction*检查是否有实现回调的函数,若回调函数无效则进行错误信息处理,正常则调用函数。ProcessEvent是UEC++底层中的可用于扩展事件处理逻辑的一个函数。
四、NewAsset
该函数主要用于创建数据时使用。
实际使用样例
这里假设在开发中,回调函数所需的参数为一个int型,那么创建一个类存储一个int型的数据(只要继承自UObject的子类都可)。
在被订阅者内,先利用工具类里的创建一个资源,然后转为所需数据类型的对象,然后对其中的数据赋值,然后进行事件分发的调用。
然后在订阅者中利用工具类添加事件订阅,然后实现接口内的函数(订阅者需要继承接口类)。
结尾
自此完成了自定义事件分发机制的工具类以及使用。