监听事件

监听方式

目前主要提供了以下几种监听事件的方式:

类型描述
DidaEventListenerComponent可以添加到一个允许添加Component的对象,会在BeginPlay的时候根据配置监听事件
DidaEventListenerWidget可以添加到一个允许添加Widget的对象,会在Construct的时候根据配置监听事件
DidaEventListenerVariable最为通用的一个监听器,允许在任何地方放置,需要自己调用函数绑定监听
DidaEventMultiListenerComponent比起DidaEventListenerComponent,它允许监听多个事件
DidaEventMultiListenerWidget比起DidaEventListenerWidget,它允许监听多个事件
DidaEventMultiListenerVariable比起DidaEventListenerVariable,它允许监听多个事件

以DidaEventListenerVariable为例,可以通过CreateListenerVariable创建一个监听器。

concept-listener-variable

如果创建了一个ListenerVariable,那么还应持有他的引用,防止Listener被GC而无法收到事件。

下面是相关参数的说明:

参数描述
Outer用作实例化Variable的Outer,同时会被用作获取EventSubsystem
Event所需要触发的事件
OnEventInvoked触发事件后的回调
Channel所监听的频道,只有不设Channel或相同Channel的事件会被触发
PriorityLayer优先级层级,会根据层级与优先级大小判断优先级
ListenerPriority优先级大小,会根据层级与优先级大小判断优先级
bShouldRegisterOnStart是否在注册时绑定监听,否则可手动调用RegisterChannelListener等

优先级决定了事件触发多个监听器时的顺序,优先级大的会被先触发

为了定义清晰,应优先使用分层来定义优先级大小

会先判断优先级枚举,枚举值越大则优先级越大

注意事项

不允许同一个DidaEventListenerInterface多次监听同一事件,重复注册监听无效。即使注册时设置不同Channel也不允许,真的需要可先解除旧的注册或创建多个实例。

允许一个DidaEventListenerInterface监听多个事件,此时每个事件触发都会调用OnEventCalled,会导致逻辑较难维护,因此还是推荐一个DidaEventListenerInterfac对应一个Event。如果真的需要监听多个事件,可以使用DidaEventMultiListenerXXX相关接口。

高级用法

为了更高级的监听用途,或者不想创建额外的对象,目前允许把一个现有的对象设置为监听器。

只需要把一个基于UObject的类加上DidaEventListenerInterface接口,并实现相关逻辑即可。

  1. 将类加上DidaEventListenerInterface接口
  2. 实现GetListenerName用于标识监听器名称,可以直接返回GetName()
  3. 实现OnEventCalled用于接收事件调用
  4. 在合适的时机调用UDidaEventLibrary::RegisterListener注册监听器
  5. 在合适的时机调用UDidaEventLibrary::UnregisterListener注销监听器