事件频道

机制说明

为了解决某些监听器不是需要监听所有某一事件的触发,所以引入了频道Channel机制。

思路上只有注册与广播相同Channel的事件会被触发(不指定Channel应所有都触发)。

  • Invoke一个None,所有Listen都会被触发(无论Listen有没有指定Channel)
  • Invoke一个Channel,相同Channel的Listen会被触发
  • Listen一个None,所有Invoke都会接收(无论Invoke有没有指定Channel)
  • Listen一个Channel,相同Channel的Invoke会接收

频道分配

对应的提供了如何使用Object来动态生成Channel的接口UDidaEventLibrary::GetObjectChannel。

默认情况下只要传入相同的对象,该函数会返回相同的Key,从而可以实现可以指定监听来自同一频道的事件。

在大部分情况下,频道是某一事件所定义的信息。因此即使Channel重名,在多个事件之间也不会冲突。

重载频道

允许一个Object继承IDidaEventChannelInterface,重写接口的ReplaceObjectChannel即可改变计算Channel的方式,需要注意如果函数返回值为false,仍会以默认方式转换。

比如可以定义Controller的计算转为以PlayerId来标识,这样也可以方便实现跨端的Channel交互。

目前提供的特殊计算记录在:特殊Channel规则汇总

需要注意如果Channel动态,则会导致依赖Channel的对应逻辑必须处理好先后顺序等问题。

魔法频道

为了解决监听器必须要在Runtime时才能指定频道,这会导致默认值设置事件监听适用性变小。

引入了一套魔法频道机制来解决一部分非Runtime指定频道的问题,当然也同样适用于Runtime时直接设置。

其基础原理为:设定一类特殊的Name,创建监听时判断如果是这些Name则自动换成另外的Channel。

因此可以直接在默认值设置时便填入这些魔法Channel,从而避免在Runtime时手动指定。

需要注意注册时机与相关魔法频道依赖对象之间的先后关系,避免创建监听时所需对象不存在。