事件总线(EBus)系统
大多数由实体-组件系统(ECS)驱动的引擎,如开放式三维引擎的 组件实体系统,都使用发布-订阅(pub/sub)模式,将事件生成器与事件消费者分离开来。在这些系统中,一个实体发布事件,感兴趣的消费者可以订阅这些事件。例如,碰撞组件希望在物体碰撞它时发布事件,而拥有该组件的实体将订阅这些事件,以便调整其他组件。
在 O3DE 中,两个主要的发布/子系统是 EBus(事件总线)和
AZ::Event
。AZ::Event “使用委托模式: 特定的组件实例有一个 AZ::Event
类型的成员,组件添加(或删除)
AZ::EventHandler
对象,这些对象为组件执行事件本身的实际处理。
在 EBus 中,监听器会订阅一个全局单例,该单例会在首次订阅时自动创建,并在最后一次断开连接时自动销毁,除了处理监听器列表和遍历这些监听器并提供回调外,其自身逻辑非常简单。由于单子是全局的,代码的任何部分都可以连接、断开或在总线上放置事件供监听器接收。EBus 通常用于事件流比事件源更重要的情况(或者事件源来自许多不同的组件,并被许多其他组件监听),并可避免为此类系统的常规实现编写模板,即创建一个自定义的全局单例来接收调用,然后再将其返回给订阅的监听者。