Files
pixelheros/.qoder/repowiki/zh/content/地图系统/怪物系统/怪物系统.md
panw 4235e3b776 refactor(game): 移除已弃用的事件常量
- 删除 UpdateHero 和 UpdateFightHero 事件
- 移除 MISSION_UPDATE 事件常量
- 优化游戏事件枚举定义
2025-10-28 16:15:47 +08:00

427 lines
13 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)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts)
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts)
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
Mon.ts文件定义了游戏中的怪物系统采用ECSEntity-Component-System架构模式通过继承Entity类并注册为`Monster`类型来实现怪物实体的管理和控制。该系统提供了完整的怪物生命周期管理,包括预制体动态加载、属性初始化、难度自适应调整以及移动行为控制等功能。
## 项目结构
怪物系统的文件组织结构体现了清晰的模块化设计:
```mermaid
graph TB
subgraph "怪物系统模块"
Mon[Mon.ts<br/>怪物实体类]
MonModel[MonModelComp.ts<br/>怪物模型组件]
BattleMove[BattleMoveComp.ts<br/>移动组件]
end
subgraph "配置系统"
HeroSet[heroSet.ts<br/>英雄配置]
HeroAttrs[HeroAttrs.ts<br/>属性配置]
end
subgraph "ECS系统"
BattleMoveSys[BattleMoveSystem.ts<br/>移动系统]
end
Mon --> MonModel
Mon --> BattleMove
Mon --> HeroSet
Mon --> HeroAttrs
BattleMoveSys --> BattleMove
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L109)
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts#L1-L20)
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L1-L16)
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L109)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L152)
## 核心组件
### Monster实体类
Monster类是怪物系统的核心实体类继承自ECS框架的Entity基类并注册为`Monster`类型。该类实现了怪物的完整生命周期管理:
- **组件管理**自动添加BattleMoveComp和MonModelComp组件
- **生命周期控制**提供init和destroy方法管理实体状态
- **预制体加载**通过load方法动态加载怪物预制体
- **属性初始化**通过hero_init方法设置怪物基础属性
### BattleMoveComp移动组件
BattleMoveComp负责控制怪物的移动行为包含以下关键属性
- **direction**移动方向1向右-1向左
- **targetX**目标X坐标
- **moving**:移动状态标识
### 属性系统
怪物系统采用统一的属性管理机制,支持:
- **基础属性**HP、MP、AP、DEF等核心战斗属性
- **百分比属性**:暴击率、闪避率等百分比型属性
- **特殊属性**:吸血、燃烧概率等特殊效果属性
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L17-L40)
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L3-L15)
## 架构概览
怪物系统采用ECS架构模式实现了高度解耦的设计
```mermaid
classDiagram
class Monster {
+MonModelComp HeroModel
+HeroViewComp HeroView
+BattleMoveComp BattleMove
+init() void
+destroy() void
+load(pos, scale, uuid, is_boss, is_call, strengthMultiplier) void
+hero_init(uuid, node, scale, box_group, is_boss, is_call, strengthMultiplier) void
}
class BattleMoveComp {
+number direction
+number targetX
+boolean moving
+reset() void
}
class MonModelComp {
+reset() void
}
class HeroViewComp {
+number scale
+FacSet fac
+HType type
+boolean is_boss
+number box_group
+number hero_uuid
+string hero_name
+number base_hp
+number base_mp
+number base_ap
+number base_def
+number hp
+number mp
+object Attrs
+object skills
+initAttrs() void
}
Monster --> BattleMoveComp : "包含"
Monster --> MonModelComp : "包含"
Monster --> HeroViewComp : "包含"
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L17-L40)
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L3-L15)
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts#L10-L19)
## 详细组件分析
### load方法预制体动态加载流程
load方法实现了怪物的完整初始化流程
```mermaid
sequenceDiagram
participant Client as "调用方"
participant Monster as "Monster实体"
participant Resources as "资源系统"
participant Scene as "场景节点"
participant BattleMove as "BattleMove组件"
Client->>Monster : load(pos, scale, uuid, ...)
Monster->>Resources : 获取预制体路径
Resources-->>Monster : 返回Prefab资源
Monster->>Scene : 实例化预制体
Scene-->>Monster : 返回Node节点
Monster->>Monster : 设置位置和缩放
Monster->>Monster : hero_init初始化属性
Monster->>BattleMove : 设置移动参数
BattleMove->>BattleMove : direction = -1
BattleMove->>BattleMove : 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参数设置怪物初始位置
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L35-L58)
### hero_init方法难度自适应属性系统
hero_init方法实现了基于strengthMultiplier的难度自适应属性调整
```mermaid
flowchart TD
Start([开始初始化]) --> GetHeroInfo["获取英雄配置信息"]
GetHeroInfo --> SetBasicProps["设置基础属性"]
SetBasicProps --> CalcStrength["计算强度倍率"]
CalcStrength --> AdjustHP["调整HP = hero.hp × strengthMultiplier"]
AdjustHP --> AdjustAP["调整AP = hero.ap × strengthMultiplier"]
AdjustAP --> AdjustDEF["调整DEF = hero.def × strengthMultiplier"]
AdjustDEF --> LoadSkills["加载技能配置"]
LoadSkills --> InitAttrs["初始化属性系统"]
InitAttrs --> Complete([初始化完成])
style Start fill:#e1f5fe
style Complete fill:#e8f5e8
style CalcStrength fill:#fff3e0
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L60-L91)
#### 属性调整机制:
1. **基础属性计算**
- HP = hero.hp × strengthMultiplier向下取整
- AP = hero.ap × strengthMultiplier向下取整
- DEF = hero.def × strengthMultiplier向下取整
2. **技能系统集成**
- 遍历hero.skills数组
- 从SkillSet配置中获取技能详细信息
- 创建技能对象并添加到hv.skills数组
3. **属性系统初始化**
- 调用getAttrs()获取默认属性值
- 调用getNeAttrs()获取负面状态属性
- 设置各项属性的基础值和当前值
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L60-L91)
### BattleMoveComp组件移动行为控制
BattleMoveComp组件驱动怪物向左移动的行为
```mermaid
stateDiagram-v2
[*] --> Idle : 初始状态
Idle --> Moving : 开始移动
Moving --> Idle : 到达目标
Moving --> Stopped : 遇到障碍
Stopped --> Moving : 清除障碍
Idle --> [*] : 销毁实体
note right of Moving : direction = -1<br/>targetX = -800
```
**图表来源**
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L3-L15)
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L10-L271)
#### 移动参数配置:
- **direction = -1**:设置向左移动的方向
- **targetX = -800**:设定左边界为目标位置
- **moving = true**:启用移动状态
**章节来源**
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.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配置表**:存储所有怪物的基础属性数据
- **MonSet位置配置**:定义怪物在战场上的初始位置
- **职业类型枚举**支持warrior、remote、mage、support、assassin五种职业
**章节来源**
- [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实体]
BattleMove[BattleMove组件]
HeroView[HeroView组件]
end
subgraph "配置模块"
HeroInfo[HeroInfo配置]
HeroAttrs[属性配置]
SkillSet[技能配置]
end
subgraph "系统模块"
BattleMoveSys[BattleMoveSystem]
SingletonModule[单例模块]
end
Monster --> ECS
Monster --> CC
Monster --> Oops
Monster --> BattleMove
Monster --> HeroView
Monster --> HeroInfo
Monster --> HeroAttrs
Monster --> SkillSet
BattleMoveSys --> BattleMove
BattleMoveSys --> HeroView
SingletonModule --> Monster
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L15)
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L1-L10)
### 关键依赖说明:
1. **ECS框架依赖**Monster类继承自ecs.EntityBattleMoveComp继承自ecs.Comp
2. **Cocos Creator依赖**使用Node、Prefab、Vec3等Cocos类型
3. **配置依赖**依赖HeroInfo、HeroAttrs、SkillSet等配置模块
4. **系统依赖**依赖BattleMoveSystem进行移动逻辑处理
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L15)
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L1-L10)
## 性能考虑
### 内存管理优化
1. **组件化设计**:通过组件分离职责,避免单个类过于庞大
2. **生命周期管理**destroy方法确保正确清理组件引用
3. **资源池化**:预制体实例化采用资源管理系统
### 性能优化策略
1. **批量更新**BattleMoveSystem采用批量处理方式
2. **条件检查**:在更新前进行状态检查,避免不必要的计算
3. **边界检测**使用validatePosition方法限制移动范围
### 扩展性设计
1. **配置驱动**:通过配置文件控制怪物属性和行为
2. **组件扩展**:支持添加新的组件类型
3. **系统扩展**BattleMoveSystem可添加新的移动逻辑
## 故障排除指南
### 常见问题及解决方案
#### 1. 怪物无法正常移动
**问题现象**:怪物加载后静止不动
**排查步骤**
- 检查BattleMoveComp的moving属性是否为true
- 验证targetX设置是否合理
- 确认BattleMoveSystem是否正常运行
**解决方案**
```typescript
// 确保移动组件正确初始化
const move = this.get(BattleMoveComp);
move.moving = true;
move.targetX = -800; // 设置合理的边界值
```
#### 2. 属性计算错误
**问题现象**:怪物属性显示异常
**排查步骤**
- 检查strengthMultiplier参数是否正确传递
- 验证HeroInfo配置中的基础属性值
- 确认属性计算逻辑
**解决方案**
```typescript
// 确保属性计算正确
const baseHp = Math.floor(hero.hp * strengthMultiplier);
const baseAp = Math.floor(hero.ap * strengthMultiplier);
const baseDef = Math.floor(hero.def * strengthMultiplier);
```
#### 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)
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L10-L50)
## 结论
Mon.ts文件实现了一个功能完整、架构清晰的怪物系统。通过ECS架构模式系统实现了高度的模块化和可扩展性。主要特点包括
1. **ECS架构优势**:通过组件化设计实现了职责分离和代码复用
2. **难度自适应**基于strengthMultiplier的属性调整机制提供了灵活的难度控制
3. **数据复用**通过HeroAttrs和heroSet配置系统实现了数据的集中管理
4. **性能优化**:采用组件化和批量处理策略确保良好的运行性能
5. **扩展性强**:支持添加新怪物类型、配置技能组合和实现召唤单位等扩展需求
该系统为游戏开发提供了坚实的基础,能够满足不同类型怪物的开发需求,同时保持了良好的维护性和扩展性。