# 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. **状态控制**:精确的游戏状态管理
该设计模式为游戏开发提供了可复用的战斗系统框架,能够适应不同类型的战斗场景需求。通过合理的事件管理和组件清理,确保了游戏运行的稳定性和性能表现。