# MissionComp事件处理机制 **本文档中引用的文件** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts) - [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts) - [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts) - [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts) - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts) - [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts) - [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts) ## 目录 1. [简介](#简介) 2. [项目结构概览](#项目结构概览) 3. [核心组件分析](#核心组件分析) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) 6. [事件处理流程](#事件处理流程) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) ## 简介 MissionComp.ts是游戏战斗系统的核心控制器,负责管理整个任务生命周期中的事件监听、处理和游戏状态管理。该组件通过事件驱动的方式协调各个子系统的运作,包括战斗准备、怪物生成、英雄死亡检测、战斗结束处理等功能。 ## 项目结构概览 ```mermaid graph TB subgraph "游戏地图模块" MissionComp[MissionComp
任务控制器] MissionMonComp[MissionMonComp
怪物控制器] VictoryComp[VictoryComp
胜利界面] end subgraph "英雄系统" HeroViewComp[HeroViewComp
英雄视图组件] HeroConComp[HeroConComp
英雄控制组件] end subgraph "技能系统" AtkConCom[AtkConCom
攻击控制组件] SkillViewCom[SkillViewCom
技能视图组件] end subgraph "事件系统" GameEvent[GameEvent
事件枚举] MessageCenter[消息中心] end MissionComp --> GameEvent MissionComp --> MessageCenter MissionMonComp --> GameEvent HeroViewComp --> GameEvent AtkConCom --> GameEvent MessageCenter --> MissionComp MessageCenter --> MissionMonComp MessageCenter --> HeroViewComp MessageCenter --> VictoryComp ``` **图表来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L151) - [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L1-L70) ## 核心组件分析 MissionComp作为游戏战斗系统的核心控制器,主要负责以下功能: ### 主要职责 - **事件监听管理**:注册并处理各种游戏事件 - **战斗状态控制**:管理战斗开始、进行、结束的状态转换 - **资源清理**:战斗结束后清理游戏实体和组件 - **数据初始化**:每局游戏开始时初始化相关数据 ### 关键属性 - `rewards`:掉落物品奖励数组 - `game_data`:游戏统计数据(经验、金币、钻石) - `node`:Cocos节点引用 **章节来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L15-L30) ## 架构概览 ```mermaid sequenceDiagram participant Player as 玩家 participant MissionComp as MissionComp participant MissionMonComp as MissionMonComp participant HeroViewComp as HeroViewComp participant VictoryComp as VictoryComp participant ECS as ECS系统 Player->>MissionComp : 启动任务 MissionComp->>MissionComp : data_init() MissionComp->>MissionComp : mission_start() MissionComp->>MissionMonComp : GameEvent.FightReady MissionMonComp->>MissionMonComp : 刷怪 MissionComp->>MissionComp : to_fight() MissionComp->>MissionComp : GameEvent.FightStart loop 战斗进行中 HeroViewComp->>MissionComp : GameEvent.HeroDead MissionComp->>MissionComp : do_hero_dead() HeroViewComp->>MissionComp : GameEvent.MonDead MissionComp->>MissionComp : do_mon_dead() end MissionComp->>MissionComp : fight_end() MissionComp->>ECS : cleanComponents() MissionComp->>VictoryComp : 打开胜利界面 ``` **图表来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L151) - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L34-L80) ## 详细组件分析 ### onLoad方法中的事件注册 MissionComp在onLoad方法中注册了多个关键事件监听器: ```mermaid classDiagram class MissionComp { +onLoad() void +do_mon_dead(event, data) void +do_hero_dead(event, data) void +fight_end() void +mission_start() Promise~void~ +data_init() void -cleanComponents() void } class GameEvent { <> MissionStart FightEnd HeroDead MonDead FightReady FightStart MissionEnd } MissionComp --> GameEvent : 监听事件 ``` **图表来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L25-L32) - [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L10-L60) #### 事件监听器详解 1. **MissionStart事件**:任务开始事件 - 触发时机:任务初始化时 - 处理逻辑:发送FightReady事件,激活节点,初始化数据 2. **MonDead事件**:怪物死亡事件 - 触发时机:怪物被击败时 - 处理逻辑:减少怪物计数 3. **HeroDead事件**:英雄死亡事件 - 触发时机:英雄生命值归零时 - 处理逻辑:减少英雄计数,判断游戏失败 4. **FightEnd事件**:战斗结束事件 - 触发时机:战斗结束时 - 处理逻辑:延迟清理游戏实体 5. **MissionEnd事件**:任务结束事件 - 触发时机:任务完成或失败时 - 处理逻辑:隐藏任务节点 **章节来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L25-L32) ### fight_end方法的延迟清理机制 fight_end方法实现了战斗结束后的延迟清理逻辑: ```mermaid flowchart TD Start([战斗结束]) --> Delay["延迟0.5秒"] Delay --> StopGame["停止游戏播放
smc.mission.play=false"] StopGame --> StopPause["停止暂停
smc.mission.pause=false"] StopPause --> CleanComponents["调用cleanComponents()"] CleanComponents --> QueryHeroes["查询所有HeroViewComp组件"] QueryHeroes --> RemoveHero["移除HeroViewComp组件"] RemoveHero --> DestroyHero["销毁英雄实体"] DestroyHero --> QueryAtk["查询所有AtkConCom组件"] QueryAtk --> RemoveAtk["移除AtkConCom组件"] RemoveAtk --> DestroyAtk["销毁攻击实体"] DestroyAtk --> QuerySkill["查询所有SkillViewCom组件"] QuerySkill --> RemoveSkill["移除SkillViewCom组件"] RemoveSkill --> DestroySkill["销毁技能实体"] DestroySkill --> End([清理完成]) ``` **图表来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L108-L116) #### cleanComponents方法实现细节 cleanComponents方法通过ECS查询系统清理不同类型的游戏实体: - **英雄实体清理**:查询所有带有HeroViewComp组件的实体 - **攻击实体清理**:查询所有带有AtkConCom组件的实体 - **技能实体清理**:查询所有带有SkillViewCom组件的实体 **章节来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L125-L130) ### do_hero_dead方法的游戏失败判定 do_hero_dead方法实现了英雄死亡时的游戏失败判定逻辑: ```mermaid flowchart TD HeroDead[英雄死亡事件] --> ReduceCount["减少英雄计数
smc.vmdata.mission_data.hero_num--"] ReduceCount --> CheckCount{"英雄计数 <= 0?"} CheckCount --> |否| Continue[继续战斗] CheckCount --> |是| DispatchEnd["分发FightEnd事件
GameEvent.FightEnd"] DispatchEnd --> OpenVictory["打开胜利界面
UIID.Victory"] OpenVictory --> SetParams["设置参数:
victory=false
rewards=this.rewards
game_data=this.game_data"] SetParams --> End[游戏失败] ``` **图表来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L54-L62) 当所有英雄都死亡时,系统会: 1. 分发FightEnd事件,携带victory=false参数 2. 打开Victory界面,显示失败状态 3. 传递奖励数组和游戏统计数据 **章节来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L54-L62) ### data_init方法的数据初始化过程 data_init方法负责每局游戏开始时的初始化工作: ```mermaid flowchart TD Start([开始初始化]) --> SetPlay["设置游戏状态
smc.mission.play = true"] SetPlay --> SetFight["设置战斗状态
smc.vmdata.mission_data.in_fight=false"] SetFight --> SetTime["设置战斗时间
smc.vmdata.mission_data.fight_time=0"] SetTime --> SetLevel["设置关卡
smc.vmdata.mission_data.level=0"] SetLevel --> InitRewards["初始化奖励数组
this.rewards=[]"] InitRewards --> Log["记录初始化日志"] Log --> End([初始化完成]) ``` **图表来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L118-L124) **章节来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L118-L124) ## 事件处理流程 ### 完整的事件派发与监听流程 以下是游戏战斗系统中典型的事件处理流程: ```mermaid sequenceDiagram participant UI as 用户界面 participant MissionComp as MissionComp participant MessageCenter as 消息中心 participant MissionMonComp as MissionMonComp participant HeroViewComp as HeroViewComp participant ECS as ECS系统 UI->>MissionComp : 点击开始战斗 MissionComp->>MessageCenter : GameEvent.MissionStart MessageCenter->>MissionComp : 接收事件 MissionComp->>MessageCenter : GameEvent.FightReady MessageCenter->>MissionMonComp : 接收事件 MissionMonComp->>MissionMonComp : 刷怪逻辑 MissionMonComp->>MessageCenter : GameEvent.FightStart MessageCenter->>MissionComp : 接收事件 loop 战斗过程中 HeroViewComp->>MessageCenter : GameEvent.MonDead MessageCenter->>MissionComp : 接收事件 MissionComp->>MissionComp : do_mon_dead() HeroViewComp->>MessageCenter : GameEvent.HeroDead MessageCenter->>MissionComp : 接收事件 MissionComp->>MissionComp : do_hero_dead() alt 英雄全部死亡 MissionComp->>MessageCenter : GameEvent.FightEnd MissionComp->>UI : 打开胜利界面 end end MissionComp->>MessageCenter : GameEvent.FightEnd MessageCenter->>MissionComp : 接收事件 MissionComp->>MissionComp : fight_end() MissionComp->>ECS : cleanComponents() ``` **图表来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L151) - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L34-L80) ### 参数传递机制 事件系统采用参数化设计,支持不同类型的参数传递: | 事件类型 | 参数结构 | 用途 | |---------|---------|------| | GameEvent.FightEnd | `{victory: boolean}` | 标识战斗结果 | | GameEvent.MissionStart | 无参数 | 启动新任务 | | GameEvent.MonDead | `data: {monsterId: number}` | 怪物死亡信息 | | GameEvent.HeroDead | `data: {heroId: number}` | 英雄死亡信息 | **章节来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L54-L62) - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L48-L52) ## 性能考虑 ### 事件监听器优化 1. **事件去重**:确保相同事件不会重复注册 2. **内存管理**:及时清理不再使用的事件监听器 3. **异步处理**:战斗结束清理采用延迟执行避免阻塞 ### ECS组件清理策略 cleanComponents方法采用批量查询和清理策略: - 使用ECS查询系统高效定位目标组件 - 批量移除和销毁相关实体 - 避免逐个遍历导致的性能问题 ## 故障排除指南 ### 常见问题及解决方案 #### 1. 事件未正确触发 **症状**:某些事件监听器没有响应 **原因**:事件名称拼写错误或事件未正确注册 **解决**:检查GameEvent枚举定义和事件监听器注册 #### 2. 战斗结束后残留实体 **症状**:战斗结束后仍有未清理的游戏实体 **原因**:cleanComponents方法未能匹配到所有组件 **解决**:检查组件标签是否正确,确保所有实体都包含相应组件 #### 3. 英雄死亡判定错误 **症状**:英雄死亡后游戏未正确判定失败 **原因**:do_hero_dead方法逻辑错误或事件传递中断 **解决**:验证英雄计数逻辑和事件分发机制 **章节来源** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L54-L62) - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L125-L130) ## 结论 MissionComp.ts作为游戏战斗系统的核心控制器,通过精心设计的事件驱动架构实现了高效的战斗管理。其主要优势包括: 1. **模块化设计**:清晰的职责分离,便于维护和扩展 2. **事件驱动**:松耦合的组件通信机制 3. **资源管理**:完善的清理机制确保内存安全 4. **状态控制**:精确的游戏状态管理 该设计模式为游戏开发提供了可复用的战斗系统框架,能够适应不同类型的战斗场景需求。通过合理的事件管理和组件清理,确保了游戏运行的稳定性和性能表现。