# 怪物生成与波次控制 **本文档引用的文件** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts) - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts) - [heroSet.ts](file://assets/script/game/common/config/heroSet.ts) - [Mon.ts](file://assets/script/game/hero/Mon.ts) - [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts) ## 目录 1. [概述](#概述) 2. [系统架构](#系统架构) 3. [核心组件分析](#核心组件分析) 4. [怪物生成机制](#怪物生成机制) 5. [波次控制逻辑](#波次控制逻辑) 6. [随机事件系统](#随机事件系统) 7. [状态机图示](#状态机图示) 8. [性能优化考虑](#性能优化考虑) 9. [故障排除指南](#故障排除指南) 10. [总结](#总结) ## 概述 MissionMonCompComp是游戏肉鸽模式中负责怪物生成与波次控制的核心组件。它实现了基于关卡配置的动态怪物生成系统,支持不同类型的怪物(普通、精英、Boss),并采用波次节奏控制机制,每5只怪物后暂停5秒形成波次节奏。 该系统通过RogueConfig提供配置驱动的怪物生成策略,支持怪物强度随关卡递增,同时集成了随机事件系统,为游戏体验增加不确定性。 ## 系统架构 ```mermaid graph TB subgraph "怪物生成系统" A[MissionMonCompComp] --> B[RogueConfig] A --> C[Monster Queue] A --> D[Timer System] A --> E[Random Event System] end subgraph "配置层" B --> F[Stage Config Rules] B --> G[Monster Type Config] B --> H[Event Config] end subgraph "实体层" I[Monster Entity] --> J[MonModelComp] I --> K[BattleMoveComp] I --> L[TalComp] end A --> I C --> M[Spawn Queue Management] D --> N[Wave Timing Control] E --> O[Event Processing] ``` **图表来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240) - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L311) ## 核心组件分析 ### MissionMonCompComp 主控制器 MissionMonCompComp作为主要的怪物生成控制器,维护以下关键状态: | 状态变量 | 类型 | 描述 | |---------|------|------| | monsterQueue | Array | 怪物生成队列,存储待生成的怪物配置 | | isSpawning | boolean | 是否正在生成怪物的状态标志 | | spawnInterval | number | 单个怪物生成间隔(默认0.1秒) | | spawnTimer | number | 生成计时器,累积时间用于控制生成节奏 | | spawnCount | number | 已生成怪物计数器 | | pauseInterval | number | 波次暂停间隔(默认5秒) | | isPausing | boolean | 是否处于波次暂停状态 | | currentEvent | EventType | 当前关卡的随机事件类型 | | eventProcessed | boolean | 随机事件是否已处理的标志 | **章节来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L18-L35) ### RogueConfig 配置系统 RogueConfig提供了完整的配置驱动怪物生成框架: ```mermaid classDiagram class RogueConfig { +MonsterType NORMAL +MonsterType ELITE +MonsterType BOSS +StageType NORMAL +StageType ELITE +StageType BOSS +StageType EVENT +EventType TREASURE +EventType TRAP +EventType BUFF +EventType DEBUFF +getStageType(stageNumber, level) StageType +getStageMonsterConfigs(stageNumber, level) Array +calculateMonsterCount(stageNumber, baseCount, minCount, maxCount) number +calculateMonsterStrengthMultiplier(stageNumber, level) number +getRandomEvent() EventType } class StageConfigRules { +NORMAL Monsters +ELITE Monsters +BOSS Monsters +EVENT Monsters } class EventConfig { +TREASURE Probability +TRAP Probability +BUFF Probability +DEBUFF Probability } RogueConfig --> StageConfigRules RogueConfig --> EventConfig ``` **图表来源** - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L25-L132) **章节来源** - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L311) ## 怪物生成机制 ### do_mon_wave 方法 - 波次初始化 do_mon_wave方法是波次生成的入口点,负责初始化所有相关状态并启动怪物生成流程: ```mermaid flowchart TD A[do_mon_wave 开始] --> B[重置生成状态] B --> C[获取当前关卡信息] C --> D[确定关卡类型] D --> E{是否为事件关卡?} E --> |是| F[生成随机事件] E --> |否| G[清除事件状态] F --> H[获取怪物配置] G --> H H --> I[生成怪物队列] I --> J[开始波次生成] B --> B1[spawnCount = 0] B --> B2[isPausing = false] B --> B3[spawnTimer = 0] B --> B4[eventProcessed = false] ``` **图表来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L85-L115) ### generateMonstersFromStageConfig 方法 - 队列生成 generateMonstersFromStageConfig方法负责解析怪物配置并构建生成队列: ```mermaid sequenceDiagram participant MC as MissionMonComp participant RC as RogueConfig participant MQ as MonsterQueue MC->>RC : getStageMonsterConfigs(stage, level) RC->>RC : generateStageConfig(stage, level) RC->>RC : calculateMonsterStrengthMultiplier(stage, level) loop 每个怪物类型 RC->>RC : getMonsterUUIDsByType(type) RC->>RC : 随机选择UUID RC-->>MC : 返回怪物配置 end MC->>MC : generateMonstersFromStageConfig(configs) loop 每个怪物配置 MC->>MC : 计算位置索引 MC->>MQ : addToStageSpawnQueue() end ``` **图表来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L147-L185) - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L265-L295) **章节来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L147-L185) - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L265-L295) ### 怪物配置结构 每个怪物配置包含以下关键信息: | 字段 | 类型 | 描述 | |------|------|------| | uuid | number | 怪物唯一标识符,对应HeroInfo中的怪物UUID | | position | number | 怪物生成位置索引(0-4) | | type | MonsterType | 怪物类型(NORMAL/ELITE/BOSS) | | level | number | 怪物等级,默认为1 | | strengthMultiplier | number | 强度倍率,随关卡递增 | **章节来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L186-L205) ## 波次控制逻辑 ### 定时器系统 - update 方法 update方法实现了精确的波次控制逻辑,每帧更新计时器并管理生成节奏: ```mermaid flowchart TD A[update(dt)] --> B{游戏是否进行中?} B --> |否| C[退出更新] B --> |是| D{有随机事件?} D --> |是且未处理| E[processRandomEvent] D --> |否或已处理| F{有怪物队列?} E --> F F --> |否| C F --> |是| G[累加spawnTimer] G --> H{是否暂停状态?} H --> |是| I{暂停时间到?} I --> |否| C I --> |是| J[结束暂停,重置状态] H --> |否| K{生成时间到?} K --> |否| C K --> |是| L[spawnNextMonster] L --> M{达到5只?} M --> |否| N[重置计时器] M --> |是| O[进入暂停状态] J --> P[继续生成] N --> P O --> Q[暂停5秒] P --> C Q --> C ``` **图表来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L55-L85) ### 波次节奏控制 波次控制采用"5+5"模式: - **生成阶段**:每0.1秒生成一只怪物,连续生成5只 - **暂停阶段**:生成5只后暂停5秒,然后恢复生成 - **计数器**:spawnCount跟踪已生成怪物数量 - **状态标志**:isPausing控制暂停状态 **章节来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L55-L85) ### spawnNextMonster 方法 - 怪物实例化 spawnNextMonster方法从队列中取出怪物配置并创建实体: ```mermaid sequenceDiagram participant MC as MissionMonComp participant ECS as ECS系统 participant M as Monster实体 participant SM as Scene Manager MC->>MC : 从队列移除第一个怪物 MC->>ECS : 获取Monster实体 MC->>M : load(position, scale, uuid, isBoss, isCall, strengthMultiplier) M->>SM : 创建怪物节点 M->>M : 设置位置和缩放 M->>M : 加载怪物资源 M->>M : 初始化战斗参数 M->>SM : 添加到场景层 MC->>MC : 增加spawnCount MC->>MC : 更新怪物计数显示 ``` **图表来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L190-L215) - [Mon.ts](file://assets/script/game/hero/Mon.ts#L35-L60) **章节来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L190-L215) ## 随机事件系统 ### 事件类型与概率 随机事件系统提供四种不同类型的事件,每种事件都有对应的触发概率: | 事件类型 | 概率 | 效果 | 处理方式 | |----------|------|------|----------| | TREASURE | 30% | 增加50金币奖励 | 直接修改游戏数据 | | TRAP | 25% | 对玩家造成伤害 | 需要实现具体伤害逻辑 | | BUFF | 25% | 给玩家临时增益效果 | 需要实现增益系统 | | DEBUFF | 20% | 给玩家临时减益效果 | 需要实现减益系统 | ### processRandomEvent 方法 processRandomEvent方法根据当前事件类型执行相应的处理逻辑: ```mermaid flowchart TD A[processRandomEvent] --> B{检查currentEvent} B --> |null| C[无事件,退出] B --> |有效事件| D{switch currentEvent} D --> |TREASURE| E[增加50金币] D --> |TRAP| F[造成伤害逻辑] D --> |BUFF| G[增加临时增益] D --> |DEBUFF| H[增加临时减益] E --> I[标记事件已处理] F --> I G --> I H --> I I --> J[eventProcessed = true] ``` **图表来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L117-L145) **章节来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L117-L145) - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L105-L132) ## 状态机图示 ### 怪物生成状态机 ```mermaid stateDiagram-v2 [*] --> 波次准备 波次准备 --> 事件检测 : do_mon_wave() 事件检测 --> 事件处理 : 是事件关卡 事件检测 --> 怪物生成 : 非事件关卡 事件处理 --> 怪物生成 : 事件已处理 怪物生成 --> 怪物实例化 : 队列非空 怪物实例化 --> 怪物实例化 : 生成间隔到达 怪物实例化 --> 波次暂停 : 达到5只 波次暂停 --> 怪物实例化 : 暂停结束 怪物实例化 --> 波次完成 : 队列为空 波次完成 --> [*] ``` ### 波次节奏状态机 ```mermaid stateDiagram-v2 [*] --> 生成中 生成中 --> 生成中 : spawnTimer < spawnInterval 生成中 --> 怪物实例化 : spawnTimer >= spawnInterval 怪物实例化 --> 生成中 : spawnCount < 5 怪物实例化 --> 波次暂停 : spawnCount >= 5 波次暂停 --> 波次暂停 : pauseTimer < pauseInterval 波次暂停 --> 生成中 : pauseTimer >= pauseInterval ``` ## 性能优化考虑 ### 内存管理 1. **实体池化**:Monster实体通过ecs.getEntity获取,避免频繁创建销毁 2. **队列管理**:使用shift/pop操作保持队列紧凑 3. **资源加载**:怪物资源预加载,减少运行时开销 ### 计算优化 1. **配置缓存**:RogueConfig中的计算结果可适当缓存 2. **随机数优化**:Math.random()调用频率控制在合理范围内 3. **事件概率计算**:使用累积概率算法提高效率 ### 渲染优化 1. **批量渲染**:怪物生成采用批量处理机制 2. **层级管理**:怪物添加到专门的EntityLayer 3. **碰撞体延迟启用**:避免过早启用碰撞体影响性能 ## 故障排除指南 ### 常见问题及解决方案 | 问题 | 症状 | 可能原因 | 解决方案 | |------|------|----------|----------| | 怪物不生成 | 队列为空但游戏仍在进行 | 配置错误或事件阻塞 | 检查RogueConfig配置和事件处理 | | 波次节奏异常 | 怪物生成过快或过慢 | 时间计算错误 | 验证update方法中的计时逻辑 | | 事件不触发 | 事件关卡没有随机事件 | 概率计算错误 | 检查getRandomEvent函数 | | 怪物位置错误 | 怪物出现在错误位置 | 位置索引计算错误 | 验证position计算逻辑 | ### 调试技巧 1. **日志记录**:启用console.log语句跟踪关键状态变化 2. **断点调试**:在关键方法设置断点观察变量值 3. **状态监控**:实时监控monsterQueue长度和计时器状态 **章节来源** - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L147-L185) ## 总结 MissionMonCompComp实现了一个功能完整且灵活的怪物生成与波次控制系统。该系统具有以下特点: 1. **配置驱动**:通过RogueConfig实现完全可配置的怪物生成策略 2. **波次节奏**:采用"5+5"模式确保游戏体验的平衡性 3. **随机事件**:集成随机事件系统增加游戏不确定性 4. **性能优化**:采用实体池化和批量处理优化性能 5. **扩展性强**:模块化设计便于功能扩展和维护 该系统为游戏肉鸽模式提供了坚实的怪物生成基础,支持复杂的关卡设计和多样化的游戏体验。通过合理的配置和适当的调整,可以满足不同类型游戏的需求。