事件频道
机制说明
为了解决某些监听器不是需要监听所有某一事件的触发,所以引入了频道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时手动指定。
需要注意注册时机与相关魔法频道依赖对象之间的先后关系,避免创建监听时所需对象不存在。