Files
pixelheros/.qoder/repowiki/zh/content/地图系统/怪物系统/怪物系统.md
2025-10-30 16:49:19 +08:00

454 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 怪物系统
<cite>
**本文档引用的文件**
- [Mon.ts](file://assets/script/game/hero/Mon.ts) - *在最近的提交中更新*
- [HeroAttrsComp.ts](file://assets/script/game/hero/HeroAttrsComp.ts) - *新增并替代旧的属性组件*
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts) - *在最近的提交中更新*
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts) - *在最近的提交中更新*
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts) - *新增怪物类型与难度配置*
- [MonMove.ts](file://assets/script/game/hero/MonMove.ts) - *移动行为控制组件*
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts) - *视图与属性管理组件*
</cite>
## 更新摘要
**变更内容**
- 重构 `Mon.ts` 中的组件依赖,移除 `MonAttrsComp``MonViewComp`,统一使用 `HeroAttrsComp``HeroViewComp`
- 引入 `MonType` 枚举普通、精英、BOSS实现差异化属性计算
- 新增 `getMonAttr` 函数用于根据等级和类型动态计算怪物属性
- 扩展 `heroSet.ts` 添加多种新怪物类型(召唤师、治疗者、光环怪等)
- 重构属性初始化流程,移除过时的 `strengthMultiplier`,改用基于等级和类型的倍率系统
- 更新架构图和流程图以反映最新的 ECS 设计和属性计算逻辑
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
`Mon.ts` 文件定义了游戏中的怪物系统,采用 ECS实体-组件-系统)架构模式,通过继承 `Entity` 类并注册为 `Monster` 类型来实现怪物实体的管理和控制。该系统提供了完整的怪物生命周期管理,包括预制体动态加载、位置设置、基于等级和类型的属性初始化以及向左移动的行为控制。本次重构引入了 `monType` 参数支持普通、精英、BOSS 三种类型,并通过 `RogueConfig.ts` 中的 `getMonAttr` 函数实现了基于等级和类型系数的动态属性计算,取代了原有的 `strengthMultiplier` 机制,使难度曲线更加平滑和可配置。同时,系统已统一使用英雄的 `HeroAttrsComp` 组件,实现了英雄与怪物之间的数据与逻辑复用,提升了代码一致性与可维护性。
## 项目结构
怪物系统的文件组织结构体现了清晰的模块化设计:
```mermaid
graph TB
subgraph "怪物系统模块"
Mon[Mon.ts<br/>怪物实体类]
MonModel[HeroAttrsComp.ts<br/>属性与模型组件]
BattleMove[MonMove.ts<br/>移动组件]
end
subgraph "配置系统"
HeroSet[heroSet.ts<br/>英雄与怪物配置]
HeroAttrs[HeroAttrs.ts<br/>属性配置]
RogueConfig[RogueConfig.ts<br/>肉鸽模式配置]
end
subgraph "ECS系统"
BattleMoveSys[MonMoveSystem.ts<br/>移动系统]
end
Mon --> MonModel
Mon --> BattleMove
Mon --> HeroSet
Mon --> HeroAttrs
Mon --> RogueConfig
BattleMoveSys --> BattleMove
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L109)
- [HeroAttrsComp.ts](file://assets/script/game/hero/HeroAttrsComp.ts#L1-L20)
- [MonMove.ts](file://assets/script/game/hero/MonMove.ts#L1-L16)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L31-L88)
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L109)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L152)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L31-L88)
## 核心组件
### Monster实体类
`Monster` 类是怪物系统的核心实体类,继承自 ECS 框架的 `Entity` 基类,并注册为 `Monster` 类型。该类实现了怪物的完整生命周期管理:
- **组件管理**:在 `init` 方法中自动添加 `MonMoveComp``HeroAttrsComp``HeroSkillsComp` 组件
- **生命周期控制**:提供 `init``destroy` 方法管理实体状态,在 `destroy` 中移除关键组件
- **预制体加载**:通过 `load` 方法动态加载怪物预制体,并传入 `uuid``lv`(等级)、`monType`(怪物类型)等参数
- **属性初始化**:通过 `load` 方法中的逻辑设置怪物基础属性,该方法现在依赖 `RogueConfig.getMonAttr` 进行计算,并直接使用 `HeroAttrsComp` 统一管理属性
### MonMoveComp移动组件
`MonMoveComp` 负责控制怪物的移动行为,包含以下关键属性:
- **direction**移动方向1向右-1向左
- **targetX**目标X坐标
- **moving**:移动状态标识
`Mon.ts``load` 方法中,该组件被初始化为向左移动(`direction = -1`)至左边界(`targetX = -800`)。
### 属性系统
怪物系统采用统一的属性管理机制,支持:
- **基础属性**HP、MP、AP、DEF 等核心战斗属性
- **百分比属性**:暴击率、闪避率等百分比型属性
- **特殊属性**:吸血、燃烧概率等特殊效果属性
属性值存储在 `HeroAttrsComp``Attrs``NeAttrs` 对象中,并通过 `initAttrs` 方法进行初始化和计算。此设计实现了英雄与怪物共用同一套属性组件,极大提升了代码复用率。
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L17-L40)
- [MonMove.ts](file://assets/script/game/hero/MonMove.ts#L3-L15)
- [HeroAttrsComp.ts](file://assets/script/game/hero/HeroAttrsComp.ts#L72-L778)
## 架构概览
怪物系统采用 ECS 架构模式,实现了高度解耦的设计:
```mermaid
classDiagram
class Monster {
+HeroAttrsComp HeroModel
+HeroViewComp HeroView
+MonMoveComp MonMove
+init() void
+destroy() void
+load(pos, scale, uuid, lv, monType, buffs, is_call) void
}
class MonMoveComp {
+number direction
+number targetX
+boolean moving
+reset() void
}
class HeroAttrsComp {
+number hero_uuid
+string hero_name
+number lv
+number type
+number fac
+number hp
+number mp
+object Attrs
+object NeAttrs
+initAttrs() void
}
class HeroViewComp {
+number scale
+number box_group
+init() void
}
Monster --> MonMoveComp : "包含"
Monster --> HeroAttrsComp : "包含"
Monster --> HeroViewComp : "包含"
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L17-L40)
- [MonMove.ts](file://assets/script/game/hero/MonMove.ts#L3-L15)
- [HeroAttrsComp.ts](file://assets/script/game/hero/HeroAttrsComp.ts#L72-L778)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L72-L778)
## 详细组件分析
### load方法预制体动态加载流程
`load` 方法实现了怪物的完整初始化流程,现已支持等级和类型参数:
```mermaid
sequenceDiagram
participant Client as "调用方"
participant Monster as "Monster实体"
participant Resources as "资源系统"
participant Scene as "场景节点"
participant MonMove as "MonMove组件"
Client->>Monster : load(pos, scale, uuid, lv, monType, ...)
Monster->>Resources : 获取预制体路径
Resources-->>Monster : 返回Prefab资源
Monster->>Scene : 实例化预制体
Scene-->>Monster : 返回Node节点
Monster->>Monster : 设置位置和缩放
Monster->>Monster : 初始化属性
Monster->>MonMove : 设置移动参数
MonMove->>MonMove : direction = -1
MonMove->>MonMove : targetX = -800
Monster->>Client : dispatchEvent("monster_load")
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L35-L58)
#### 关键步骤解析:
1. **预制体路径构建**:根据 `uuid``HeroInfo` 配置中获取对应的预制体路径
2. **实例化处理**:使用 `oops.res.get` 获取预制体并实例化
3. **场景集成**:将实例化的节点添加到场景的 `entityLayer`
4. **碰撞体管理**:先禁用碰撞体,延迟一帧再启用以避免初始化问题
5. **位置设置**:根据传入的 `pos` 参数设置怪物初始位置
6. **属性初始化**:调用 `getMonAttr` 计算属性,并赋值给 `HeroAttrsComp`
7. **技能初始化**:通过 `HeroSkillsComp.initSkills` 加载技能配置
8. **移动初始化**:设置 `MonMoveComp` 的方向和目标
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L35-L58)
### 属性初始化:基于等级与类型的属性系统
`load` 方法中实现了基于 `lv`(等级)和 `monType`(怪物类型)的属性调整,取代了旧的 `strengthMultiplier` 机制:
```mermaid
flowchart TD
Start([开始初始化]) --> GetHeroInfo["获取英雄配置信息"]
GetHeroInfo --> CalcAttr["调用getMonAttr计算属性"]
CalcAttr --> SetBasicProps["设置基础属性"]
SetBasicProps --> LoadSkills["加载技能配置"]
LoadSkills --> InitAttrs["初始化属性系统"]
InitAttrs --> Complete([初始化完成])
style Start fill:#e1f5fe
style Complete fill:#e8f5e8
style CalcAttr fill:#fff3e0
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L60-L91)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L79-L88)
#### 属性调整机制:
1. **基础属性计算**
调用 `getMonAttr(lv, uuid, monType)` 函数,该函数根据以下公式计算:
```
hp = hero.hp * lv * MonAttrSet[monType].HP_MAX
ap = hero.ap * lv * MonAttrSet[monType].AP
def = hero.def * lv * MonAttrSet[monType].DEF
```
其中 `MonAttrSet` 定义了不同类型普通、精英、BOSS的属性倍率。
2. **技能系统集成**
- 遍历 `hero.skills` 数组
- 从 `SkillSet` 配置中获取技能详细信息
- 创建技能对象并添加到 `HeroSkillsComp` 中
3. **属性系统初始化**
- 调用 `getAttrs()` 获取默认属性值
- 调用 `getNeAttrs()` 获取负面状态属性
- 将计算出的 `hp`, `ap`, `def` 等值赋给 `Attrs` 对象中的对应属性
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L60-L91)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L79-L88)
### MonMoveComp组件移动行为控制
`MonMoveComp` 组件驱动怪物向左移动的行为:
```mermaid
stateDiagram-v2
[*] --> Idle : 初始状态
Idle --> Moving : 开始移动
Moving --> Idle : 到达目标
Moving --> Stopped : 遇到障碍
Stopped --> Moving : 清除障碍
Idle --> [*] : 销毁实体
note right of Moving : direction = -1<br/>targetX = -800
```
**图表来源**
- [MonMove.ts](file://assets/script/game/hero/MonMove.ts#L3-L15)
- [MonMoveSystem.ts](file://assets/script/game/hero/MonMove.ts#L10-L271)
#### 移动参数配置:
- **direction = -1**:设置向左移动的方向
- **targetX = -800**:设定左边界为目标位置
- **moving = true**:启用移动状态
**章节来源**
- [MonMove.ts](file://assets/script/game/hero/MonMove.ts#L3-L15)
### 数据复用机制HeroAttrs与heroSet配置
怪物系统通过 `HeroAttrs.ts` 和 `heroSet.ts` 实现英雄配置的数据复用:
#### HeroAttrs.ts属性系统
`HeroAttrs.ts` 定义了完整的属性枚举和类型系统:
| 属性类别 | 属性名称 | 类型 | 描述 |
|---------|---------|------|------|
| 基础生存属性 | HP_MAX | VALUE | 最大生命值 |
| 基础生存属性 | MP_MAX | VALUE | 最大魔法值 |
| 攻击属性 | AP | VALUE | 攻击力 |
| 攻击属性 | MAP | VALUE | 魔法攻击力 |
| 防御属性 | DEF | VALUE | 物理防御 |
| 特殊效果属性 | CRITICAL | RATIO | 暴击率 |
| 增益效果属性 | SPEED | RATIO | 移动速度加成 |
#### heroSet.ts配置系统
`heroSet.ts` 提供了怪物配置的集中管理:
- **HeroInfo配置表**:存储所有怪物的基础属性数据,`fac: FacSet.MON` 标识为怪物
- **MonSet位置配置**:定义怪物在战场上的初始位置
- **职业类型枚举**:支持 `warrior`、`remote`、`mage`、`support`、`assassin` 五种职业
- **新增怪物类型**:包括 `5214` 死灵法师(召唤师)、`5215` 祭司(治疗者)、`5216` 光环幽灵(光环怪)等特殊机制怪物
**章节来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L25-L105)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L60-L152)
## 依赖关系分析
怪物系统的依赖关系体现了清晰的分层架构:
```mermaid
graph TD
subgraph "外部依赖"
ECS[ECS框架]
CC[Cocos Creator]
Oops[Oops插件框架]
end
subgraph "核心模块"
Monster[Monster实体]
MonMove[MonMove组件]
HeroView[HeroView组件]
HeroAttrs[HeroAttrs组件]
end
subgraph "配置模块"
HeroInfo[HeroInfo配置]
HeroAttrs[属性配置]
SkillSet[技能配置]
RogueConfig[肉鸽配置]
end
subgraph "系统模块"
MonMoveSystem[MonMoveSystem]
SingletonModule[单例模块]
end
Monster --> ECS
Monster --> CC
Monster --> Oops
Monster --> MonMove
Monster --> HeroAttrs
Monster --> HeroView
Monster --> HeroInfo
Monster --> HeroAttrs
Monster --> SkillSet
Monster --> RogueConfig
MonMoveSystem --> MonMove
MonMoveSystem --> HeroAttrs
SingletonModule --> Monster
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L15)
- [MonMoveSystem.ts](file://assets/script/game/hero/MonMove.ts#L1-L10)
### 关键依赖说明:
1. **ECS框架依赖**`Monster` 类继承自 `ecs.Entity``MonMoveComp` 继承自 `ecs.Comp`
2. **Cocos Creator依赖**:使用 `Node`、`Prefab`、`Vec3` 等 Cocos 类型
3. **配置依赖**:依赖 `HeroInfo`、`HeroAttrs`、`SkillSet`、`RogueConfig` 等配置模块
4. **系统依赖**:依赖 `MonMoveSystem` 进行移动逻辑处理
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L15)
- [MonMoveSystem.ts](file://assets/script/game/hero/MonMove.ts#L1-L10)
## 性能考虑
### 内存管理优化
1. **组件化设计**:通过组件分离职责,避免单个类过于庞大
2. **生命周期管理**`destroy` 方法确保正确清理组件引用
3. **资源池化**:预制体实例化采用资源管理系统
### 性能优化策略
1. **批量更新**`MonMoveSystem` 采用批量处理方式
2. **条件检查**:在更新前进行状态检查,避免不必要的计算
3. **边界检测**:使用 `validatePosition` 方法限制移动范围
### 扩展性设计
1. **配置驱动**:通过 `heroSet.ts` 和 `RogueConfig.ts` 控制怪物属性和行为
2. **组件扩展**:支持添加新的组件类型(如 `BuffComp`、`TalComp`
3. **系统扩展**`MonMoveSystem` 可添加新的移动逻辑
## 故障排除指南
### 常见问题及解决方案
#### 1. 怪物无法正常移动
**问题现象**:怪物加载后静止不动
**排查步骤**
- 检查 `MonMoveComp` 的 `moving` 属性是否为 `true`
- 验证 `targetX` 设置是否合理
- 确认 `MonMoveSystem` 是否正常运行
**解决方案**
```typescript
// 确保移动组件正确初始化
const move = this.get(MonMoveComp);
move.moving = true;
move.targetX = -800; // 设置合理的边界值
```
#### 2. 属性计算错误
**问题现象**:怪物属性显示异常
**排查步骤**
- 检查 `lv` 和 `monType` 参数是否正确传递
- 验证 `HeroInfo` 配置中的基础属性值
- 确认 `getMonAttr` 函数的计算逻辑
**解决方案**
```typescript
// 确保属性计算正确
const {hp, ap, def} = getMonAttr(lv, uuid, monType);
hv.base_hp = hp;
hv.base_ap = ap;
hv.base_def = def;
```
#### 3. 预制体加载失败
**问题现象**:怪物无法显示模型
**排查步骤**
- 检查 `HeroInfo` 中的 `path` 配置是否正确
- 验证资源路径是否存在
- 确认资源是否已正确打包
**解决方案**
```typescript
// 确保资源路径正确
var path = "game/heros/" + HeroInfo[uuid].path;
var prefab: Prefab = oops.res.get(path, Prefab)!;
```
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L35-L58)
- [MonMoveSystem.ts](file://assets/script/game/hero/MonMove.ts#L10-L50)
## 结论
`Mon.ts` 文件实现了一个功能完整、架构清晰的怪物系统。通过 ECS 架构模式,系统实现了高度的模块化和可扩展性。主要特点包括:
1. **ECS架构优势**:通过组件化设计实现了职责分离和代码复用
2. **难度自适应**:基于 `lv` 和 `monType` 的属性调整机制提供了灵活的难度控制
3. **数据复用**:通过 `HeroAttrsComp` 统一管理英雄与怪物属性,实现逻辑一致性
4. **性能优化**:采用组件化和批量处理策略确保良好的运行性能
5. **扩展性强**:支持添加新怪物类型、配置技能组合和实现召唤单位等扩展需求
该系统为游戏开发提供了坚实的基础,能够满足不同类型怪物的开发需求,同时保持了良好的维护性和扩展性。