Skip to content

Event 与 Observer

第 7 章的碰碰车场靠消息运转得很好,但试着把同一套机制搬进另一个场景:火焰附魔。规则只有一句话——“附魔装上的瞬间,武器要当场烧起来”。用 Message 写,你会撞上它与生俱来的两个短板:

  • 慢半拍。消息是模式:写者投进缓冲,读者要等到自己被调度时才来取。“装上附魔”发生在这一帧的某个系统里,“点火”的读者最快也要等到本帧晚些时候——要是它恰好排在写者前面,就得等到下一帧。一步联动还能忍,要是点火之后还要联动光环、光环再联动属性重算,每一环都慢半拍,几帧就过去了。
  • 没有准星。消息广播给所有读者,但“烧起来”针对的是某一件武器。把 Entity 塞进消息字段当然可以,可每个读者都得自己过滤一遍“这条是不是说我的”。

Event(事件)与 Observer(观察者)是这两个短板的解药,合起来是 Bevy 的模式:事件被触发的那一刻,所有盯着它的 observer 当场依次运行——不进缓冲、不等调度、没有游标,还能精确瞄准单个实体。第 7 章说过 Event 这个名字在 0.17 之前属于缓冲消息,现在可以把分工讲全了:Message 负责缓冲广播,Event 负责即时响应,两套机制各司其职。

本章的舞台是一座冒险者公会。大厅的铜锣负责“第一个 Observer”;鉴定室教会事件指名道姓;附魔台上演本章的主菜——组件装上、卸下的瞬间,引擎自动触发的生命周期事件;账房则展示规矩如何直接长在组件身上(组件钩子)。最后照例把全部人马拼成一个会自己打烊的完整程序。