399 lines
13 KiB
Markdown
399 lines
13 KiB
Markdown
# 怪物生成与波次控制
|
||
|
||
<cite>
|
||
**本文档引用的文件**
|
||
- [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)
|
||
</cite>
|
||
|
||
## 目录
|
||
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. **扩展性强**:模块化设计便于功能扩展和维护
|
||
|
||
该系统为游戏肉鸽模式提供了坚实的怪物生成基础,支持复杂的关卡设计和多样化的游戏体验。通过合理的配置和适当的调整,可以满足不同类型游戏的需求。 |