# OrEvent组合事件 **本文引用的文件** - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs) - [OrEventExtensions.cs](file://GFramework.Core/extensions/OrEventExtensions.cs) - [EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs) - [EasyEventGeneric.cs](file://GFramework.Core/events/EasyEventGeneric.cs) - [EasyEvents.cs](file://GFramework.Core/events/EasyEvents.cs) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs) - [IEvent.cs](file://GFramework.Core.Abstractions/events/IEvent.cs) - [IUnRegister.cs](file://GFramework.Core.Abstractions/events/IUnRegister.cs) - [DefaultUnRegister.cs](file://GFramework.Core/events/DefaultUnRegister.cs) - [UnRegisterList.cs](file://GFramework.Core/events/UnRegisterList.cs) - [UnRegisterListExtension.cs](file://GFramework.Core/extensions/UnRegisterListExtension.cs) - [OrEventTests.cs](file://GFramework.Core.Tests/events/OrEventTests.cs) - [README.md(事件包)](file://GFramework.Core/events/README.md) ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 引言 本技术文档聚焦于 OrEvent 组合事件系统,系统性阐述其“或逻辑”组合设计理念、多事件源合并处理机制、事件传播策略、事件聚合与优先级处理规则,以及注册、触发与注销的完整流程。同时提供多条件触发、事件合并等实际应用场景,并与传统事件系统进行对比分析,帮助读者高效构建复杂事件处理逻辑。 ## 项目结构 围绕事件系统的核心文件分布如下: - 事件抽象与基础设施:IEvent、IUnRegister、DefaultUnRegister、UnRegisterList、UnRegisterListExtension - 事件实现:EasyEvent、Event、Event、EasyEvents、EventBus - 组合事件:OrEvent、OrEventExtensions - 测试与文档:OrEventTests、事件包使用说明 ```mermaid graph TB subgraph "事件抽象层" IE["IEvent 接口"] IU["IUnRegister 接口"] end subgraph "事件实现层" EE["EasyEvent"] EG["Event"] EGG["Event"] EEV["EasyEvents"] EB["EventBus"] end subgraph "组合与扩展" OE["OrEvent"] OEE["OrEventExtensions"] end subgraph "注销与辅助" DUR["DefaultUnRegister"] URL["UnRegisterList"] ULE["UnRegisterListExtension"] end IE --> EE IE --> EG IE --> EGG EEV --> EE EEV --> EG EB --> EEV OE --> IE OE --> DUR OE --> URL OEE --> OE ULE --> URL ``` 图表来源 - [IEvent.cs](file://GFramework.Core.Abstractions/events/IEvent.cs#L8-L16) - [IUnRegister.cs](file://GFramework.Core.Abstractions/events/IUnRegister.cs#L6-L12) - [EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs#L8-L39) - [EasyEventGeneric.cs](file://GFramework.Core/events/EasyEventGeneric.cs#L10-L123) - [EasyEvents.cs](file://GFramework.Core/events/EasyEvents.cs#L9-L85) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L8-L55) - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs#L9-L57) - [OrEventExtensions.cs](file://GFramework.Core/extensions/OrEventExtensions.cs#L9-L21) - [DefaultUnRegister.cs](file://GFramework.Core/events/DefaultUnRegister.cs#L9-L22) - [UnRegisterList.cs](file://GFramework.Core/events/UnRegisterList.cs#L8-L37) - [UnRegisterListExtension.cs](file://GFramework.Core/extensions/UnRegisterListExtension.cs#L8-L32) 章节来源 - [README.md(事件包)](file://GFramework.Core/events/README.md#L1-L523) ## 核心组件 - OrEvent:实现“或逻辑”组合,任一子事件触发即触发组合事件;支持链式 Or 组合与多处理程序注册。 - OrEventExtensions:提供便捷扩展方法,快速创建两个事件的 Or 组合。 - IEvent/IUnRegister:事件与注销的统一抽象,保证组合与普通事件一致的注册/注销语义。 - DefaultUnRegister/UnRegisterList:统一注销机制与批量注销能力,简化生命周期管理。 - EasyEvent/Event/Event:基础事件与泛型事件,提供参数化事件能力。 - EasyEvents/EventBus:全局事件管理与类型化事件总线,便于跨模块事件分发。 章节来源 - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs#L9-L57) - [OrEventExtensions.cs](file://GFramework.Core/extensions/OrEventExtensions.cs#L9-L21) - [IEvent.cs](file://GFramework.Core.Abstractions/events/IEvent.cs#L8-L16) - [IUnRegister.cs](file://GFramework.Core.Abstractions/events/IUnRegister.cs#L6-L12) - [DefaultUnRegister.cs](file://GFramework.Core/events/DefaultUnRegister.cs#L9-L22) - [UnRegisterList.cs](file://GFramework.Core/events/UnRegisterList.cs#L8-L37) - [EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs#L8-L39) - [EasyEventGeneric.cs](file://GFramework.Core/events/EasyEventGeneric.cs#L10-L123) - [EasyEvents.cs](file://GFramework.Core/events/EasyEvents.cs#L9-L85) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L8-L55) ## 架构概览 OrEvent 将多个 IEvent 作为输入源,通过注册回调的方式监听各子事件;当任意子事件触发时,统一回调会执行,从而触发组合事件的处理程序集合。组合事件本身不存储事件数据,仅承载“或逻辑”的触发语义。 ```mermaid sequenceDiagram participant C as "调用方" participant OE as "OrEvent" participant E1 as "事件源1" participant E2 as "事件源2" C->>OE : "注册处理程序" C->>OE : "链式 Or(E1).Or(E2)" OE->>E1 : "注册触发回调" OE->>E2 : "注册触发回调" E1-->>OE : "触发回调" OE-->>C : "执行已注册处理程序" E2-->>OE : "触发回调" OE-->>C : "执行已注册处理程序" ``` 图表来源 - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs#L23-L56) - [IEvent.cs](file://GFramework.Core.Abstractions/events/IEvent.cs#L10-L16) - [DefaultUnRegister.cs](file://GFramework.Core/events/DefaultUnRegister.cs#L9-L22) ## 详细组件分析 ### OrEvent 组件分析 - 设计理念:以最小代价实现“或逻辑”组合,保持与 IEvent 一致的注册/注销语义,支持链式组合与多处理程序。 - 关键行为: - Or:将指定事件注册为子事件源,内部通过注册统一触发回调,并将注销句柄加入注销列表。 - Register/UnRegister:维护组合事件的处理程序集合,支持动态增删。 - Trigger:由子事件触发回调统一调用,确保任一子事件触发即触发组合事件。 - 事件传播策略:采用“冒泡式”传播,子事件触发 -> 组合事件触发回调 -> 执行所有已注册处理程序。 - 事件聚合与优先级:OrEvent 不引入额外的聚合逻辑与优先级排序,遵循“先注册先触发”的委托链顺序。 ```mermaid classDiagram class OrEvent { -Action _mOnEvent +IList~IUnRegister~ UnregisterList +Or(event) OrEvent +Register(onEvent) IUnRegister +UnRegister(onEvent) void -Trigger() void } class IEvent { <> +Register(onEvent) IUnRegister } class IUnRegister { <> +UnRegister() void } class DefaultUnRegister { -Action _mOnUnRegister +UnRegister() void } class UnRegisterList { +IList~IUnRegister~ UnregisterList +Add(unRegister) void +UnRegisterAll() void } OrEvent ..|> IUnRegisterList OrEvent --> IEvent : "Or() 注册子事件" OrEvent --> DefaultUnRegister : "返回注销句柄" OrEvent --> UnRegisterList : "收集注销项" ``` 图表来源 - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs#L9-L57) - [IEvent.cs](file://GFramework.Core.Abstractions/events/IEvent.cs#L8-L16) - [IUnRegister.cs](file://GFramework.Core.Abstractions/events/IUnRegister.cs#L6-L12) - [DefaultUnRegister.cs](file://GFramework.Core/events/DefaultUnRegister.cs#L9-L22) - [UnRegisterList.cs](file://GFramework.Core/events/UnRegisterList.cs#L8-L37) 章节来源 - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs#L9-L57) - [OrEventTests.cs](file://GFramework.Core.Tests/events/OrEventTests.cs#L16-L103) ### OrEventExtensions 组件分析 - 提供便捷扩展方法,将两个 IEvent 进行 Or 组合,形成新的 OrEvent 实例,便于链式组合与快速构建。 - 语义等价于:new OrEvent().Or(self).Or(e)。 章节来源 - [OrEventExtensions.cs](file://GFramework.Core/extensions/OrEventExtensions.cs#L9-L21) ### 事件聚合与优先级处理规则 - 聚合逻辑:OrEvent 仅负责将多个事件源的触发汇聚到自身触发回调,不做数据聚合或去重。 - 优先级规则:未引入显式优先级;处理程序按注册顺序依次执行,遵循委托链的先后顺序。 章节来源 - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs#L34-L56) ### 注册、触发与注销流程 - 注册:调用 Register 注册处理程序,返回 IUnRegister;Or 组合时,子事件通过 Register(Trigger) 注册统一触发回调,并将注销句柄加入 OrEvent 的注销列表。 - 触发:任一子事件触发时,调用 Trigger,进而执行所有已注册处理程序。 - 注销:调用 UnRegister 移除指定处理程序;OrEvent 的注销会触发其注销列表中所有子事件的注销。 ```mermaid flowchart TD Start(["开始"]) --> Reg["注册处理程序
Register(onEvent)"] Reg --> Chain["链式 Or 组合
Or(event)"] Chain --> SubReg["子事件注册触发回调
Register(Trigger)"] SubReg --> Wait["等待子事件触发"] Wait --> Fire{"任一子事件触发?"} Fire --> |是| Exec["执行所有处理程序
Trigger()"] Fire --> |否| Wait Exec --> Unreg["注销处理程序
UnRegister(onEvent)"] Unreg --> End(["结束"]) ``` 图表来源 - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs#L23-L56) - [IUnRegister.cs](file://GFramework.Core.Abstractions/events/IUnRegister.cs#L6-L12) 章节来源 - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs#L23-L56) - [UnRegisterListExtension.cs](file://GFramework.Core/extensions/UnRegisterListExtension.cs#L15-L31) ### 与传统事件系统的对比分析 - 传统事件系统(如 EasyEvent/Event):面向单一事件源,适合一对一或一对多的直接通信。 - OrEvent 组合事件:面向多事件源的“或逻辑”聚合,适合多条件触发、事件合并等场景,降低分支判断复杂度。 - 适用性建议: - 使用 EasyEvent/Event:明确单一事件源、需要参数化事件数据。 - 使用 OrEvent:需要将多个事件源合并为一个触发点,简化上层逻辑。 章节来源 - [README.md(事件包)](file://GFramework.Core/events/README.md#L507-L523) ### 实际应用示例 - 多条件触发:将键盘输入、鼠标点击、触摸检测等多个输入事件组合为“任意输入即触发”,统一进入输入处理流程。 - 事件合并:将物理伤害、魔法伤害、中毒伤害等不同来源的伤害事件合并为“任何伤害”事件,集中播放受击特效与音效。 - 与全局事件系统结合:通过 EasyEvents/EventBus 获取/发送事件,再用 OrEvent 进行组合,实现模块间解耦的复合事件。 章节来源 - [README.md(事件包)](file://GFramework.Core/events/README.md#L182-L195) - [EasyEvents.cs](file://GFramework.Core/events/EasyEvents.cs#L26-L48) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L16-L44) ## 依赖分析 - OrEvent 依赖 IEvent 抽象,确保与具体事件实现解耦;通过 DefaultUnRegister 提供统一注销能力;通过 UnRegisterList 收集子事件的注销句柄,实现批量注销。 - OrEventExtensions 依赖 OrEvent 与 IEvent,提供便捷组合入口。 - EasyEvent/Event/Event 提供参数化事件能力,支撑 OrEvent 的数据无关特性(OrEvent 仅关注触发时机)。 - EasyEvents/EventBus 提供全局事件管理与类型化事件总线,便于跨模块事件分发与组合。 ```mermaid graph LR OE["OrEvent"] --> IE["IEvent"] OE --> DUR["DefaultUnRegister"] OE --> URL["UnRegisterList"] OEE["OrEventExtensions"] --> OE OEE --> IE EE["EasyEvent"] --> IE EG["Event"] --> IE EGG["Event"] --> IE EEV["EasyEvents"] --> EE EEV --> EG EB["EventBus"] --> EEV ``` 图表来源 - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs#L9-L57) - [OrEventExtensions.cs](file://GFramework.Core/extensions/OrEventExtensions.cs#L9-L21) - [IEvent.cs](file://GFramework.Core.Abstractions/events/IEvent.cs#L8-L16) - [DefaultUnRegister.cs](file://GFramework.Core/events/DefaultUnRegister.cs#L9-L22) - [UnRegisterList.cs](file://GFramework.Core/events/UnRegisterList.cs#L8-L37) - [EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs#L8-L39) - [EasyEventGeneric.cs](file://GFramework.Core/events/EasyEventGeneric.cs#L10-L123) - [EasyEvents.cs](file://GFramework.Core/events/EasyEvents.cs#L9-L85) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L8-L55) 章节来源 - [OrEvent.cs](file://GFramework.Core/events/OrEvent.cs#L9-L57) - [OrEventExtensions.cs](file://GFramework.Core/extensions/OrEventExtensions.cs#L9-L21) - [EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs#L8-L39) - [EasyEventGeneric.cs](file://GFramework.Core/events/EasyEventGeneric.cs#L10-L123) - [EasyEvents.cs](file://GFramework.Core/events/EasyEvents.cs#L9-L85) - [EventBus.cs](file://GFramework.Core/events/EventBus.cs#L8-L55) ## 性能考量 - OrEvent 本身不存储事件数据,仅维护处理程序委托链,触发开销主要来自委托链执行与一次统一回调。 - 子事件数量增加会线性增加注册回调数量,但触发路径仍为常数级(一次统一回调 -> 多处理程序)。 - 建议: - 控制组合事件中的子事件数量,避免过长的处理程序链。 - 将耗时逻辑放入异步或延迟执行,避免阻塞触发路径。 - 使用 UnRegisterList 批量注销,防止事件泄漏导致处理程序累积。 ## 故障排查指南 - 组合事件未触发: - 检查是否正确调用链式 Or 组合并注册处理程序。 - 确认子事件确实被触发,且未被提前注销。 - 处理程序未被注销: - 使用返回的 IUnRegister 或 UnRegisterList.UnRegisterAll 进行注销。 - 确保在合适的生命周期(如退出场景树)执行注销。 - 多处理程序重复触发: - 检查是否重复注册同一处理程序。 - 使用 UnRegister 移除多余处理程序。 章节来源 - [OrEventTests.cs](file://GFramework.Core.Tests/events/OrEventTests.cs#L16-L103) - [UnRegisterListExtension.cs](file://GFramework.Core/extensions/UnRegisterListExtension.cs#L24-L31) ## 结论 OrEvent 通过“或逻辑”组合多个事件源,显著简化多条件触发与事件合并场景的上层逻辑。其与 IEvent 抽象、DefaultUnRegister、UnRegisterList 的协作,提供了统一、可扩展、易维护的事件组合能力。配合 EasyEvents/EventBus,可在模块间实现松耦合的复合事件处理,适用于游戏开发中常见的输入聚合、状态合并、跨模块通知等场景。 ## 附录 - 快速上手要点: - 使用 OrEventExtensions 快速组合两个事件。 - 通过链式 Or 组合多个事件源。 - 使用 Register/UnRegister 管理处理程序。 - 使用 UnRegisterList 管理批量注销。 章节来源 - [README.md(事件包)](file://GFramework.Core/events/README.md#L182-L195) - [OrEventExtensions.cs](file://GFramework.Core/extensions/OrEventExtensions.cs#L17-L20) - [UnRegisterList.cs](file://GFramework.Core/events/UnRegisterList.cs#L29-L36)