13 KiB
怪物系统
**本文档引用的文件** - [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)目录
简介
Mon.ts文件定义了游戏中的怪物系统,采用ECS(Entity-Component-System)架构模式,通过继承Entity类并注册为Monster类型来实现怪物实体的管理和控制。该系统提供了完整的怪物生命周期管理,包括预制体动态加载、属性初始化、难度自适应调整以及移动行为控制等功能。
项目结构
怪物系统的文件组织结构体现了清晰的模块化设计:
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
图表来源
章节来源
核心组件
Monster实体类
Monster类是怪物系统的核心实体类,继承自ECS框架的Entity基类,并注册为Monster类型。该类实现了怪物的完整生命周期管理:
- 组件管理:自动添加BattleMoveComp和MonModelComp组件
- 生命周期控制:提供init和destroy方法管理实体状态
- 预制体加载:通过load方法动态加载怪物预制体
- 属性初始化:通过hero_init方法设置怪物基础属性
BattleMoveComp移动组件
BattleMoveComp负责控制怪物的移动行为,包含以下关键属性:
- direction:移动方向(1向右,-1向左)
- targetX:目标X坐标
- moving:移动状态标识
属性系统
怪物系统采用统一的属性管理机制,支持:
- 基础属性:HP、MP、AP、DEF等核心战斗属性
- 百分比属性:暴击率、闪避率等百分比型属性
- 特殊属性:吸血、燃烧概率等特殊效果属性
章节来源
架构概览
怪物系统采用ECS架构模式,实现了高度解耦的设计:
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 : "包含"
图表来源
详细组件分析
load方法:预制体动态加载流程
load方法实现了怪物的完整初始化流程:
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")
图表来源
关键步骤解析:
- 预制体路径构建:根据uuid从HeroInfo配置中获取对应的预制体路径
- 实例化处理:使用oops.res.get获取预制体并实例化
- 场景集成:将实例化的节点添加到场景的entityLayer中
- 碰撞体管理:先禁用碰撞体,延迟一帧再启用以避免初始化问题
- 位置设置:根据传入的pos参数设置怪物初始位置
章节来源
hero_init方法:难度自适应属性系统
hero_init方法实现了基于strengthMultiplier的难度自适应属性调整:
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
图表来源
属性调整机制:
-
基础属性计算:
- HP = hero.hp × strengthMultiplier(向下取整)
- AP = hero.ap × strengthMultiplier(向下取整)
- DEF = hero.def × strengthMultiplier(向下取整)
-
技能系统集成:
- 遍历hero.skills数组
- 从SkillSet配置中获取技能详细信息
- 创建技能对象并添加到hv.skills数组
-
属性系统初始化:
- 调用getAttrs()获取默认属性值
- 调用getNeAttrs()获取负面状态属性
- 设置各项属性的基础值和当前值
章节来源
BattleMoveComp组件:移动行为控制
BattleMoveComp组件驱动怪物向左移动的行为:
stateDiagram-v2
[*] --> Idle : 初始状态
Idle --> Moving : 开始移动
Moving --> Idle : 到达目标
Moving --> Stopped : 遇到障碍
Stopped --> Moving : 清除障碍
Idle --> [*] : 销毁实体
note right of Moving : direction = -1<br/>targetX = -800
图表来源
移动参数配置:
- direction = -1:设置向左移动的方向
- targetX = -800:设定左边界为目标位置
- moving = true:启用移动状态
章节来源
数据复用机制: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五种职业
章节来源
依赖关系分析
怪物系统的依赖关系体现了清晰的分层架构:
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
图表来源
关键依赖说明:
- ECS框架依赖:Monster类继承自ecs.Entity,BattleMoveComp继承自ecs.Comp
- Cocos Creator依赖:使用Node、Prefab、Vec3等Cocos类型
- 配置依赖:依赖HeroInfo、HeroAttrs、SkillSet等配置模块
- 系统依赖:依赖BattleMoveSystem进行移动逻辑处理
章节来源
性能考虑
内存管理优化
- 组件化设计:通过组件分离职责,避免单个类过于庞大
- 生命周期管理:destroy方法确保正确清理组件引用
- 资源池化:预制体实例化采用资源管理系统
性能优化策略
- 批量更新:BattleMoveSystem采用批量处理方式
- 条件检查:在更新前进行状态检查,避免不必要的计算
- 边界检测:使用validatePosition方法限制移动范围
扩展性设计
- 配置驱动:通过配置文件控制怪物属性和行为
- 组件扩展:支持添加新的组件类型
- 系统扩展:BattleMoveSystem可添加新的移动逻辑
故障排除指南
常见问题及解决方案
1. 怪物无法正常移动
问题现象:怪物加载后静止不动
排查步骤:
- 检查BattleMoveComp的moving属性是否为true
- 验证targetX设置是否合理
- 确认BattleMoveSystem是否正常运行
解决方案:
// 确保移动组件正确初始化
const move = this.get(BattleMoveComp);
move.moving = true;
move.targetX = -800; // 设置合理的边界值
2. 属性计算错误
问题现象:怪物属性显示异常
排查步骤:
- 检查strengthMultiplier参数是否正确传递
- 验证HeroInfo配置中的基础属性值
- 确认属性计算逻辑
解决方案:
// 确保属性计算正确
const baseHp = Math.floor(hero.hp * strengthMultiplier);
const baseAp = Math.floor(hero.ap * strengthMultiplier);
const baseDef = Math.floor(hero.def * strengthMultiplier);
3. 预制体加载失败
问题现象:怪物无法显示模型
排查步骤:
- 检查HeroInfo中的path配置是否正确
- 验证资源路径是否存在
- 确认资源是否已正确打包
解决方案:
// 确保资源路径正确
var path = "game/heros/" + HeroInfo[uuid].path;
var prefab: Prefab = oops.res.get(path, Prefab)!;
章节来源
结论
Mon.ts文件实现了一个功能完整、架构清晰的怪物系统。通过ECS架构模式,系统实现了高度的模块化和可扩展性。主要特点包括:
- ECS架构优势:通过组件化设计实现了职责分离和代码复用
- 难度自适应:基于strengthMultiplier的属性调整机制提供了灵活的难度控制
- 数据复用:通过HeroAttrs和heroSet配置系统实现了数据的集中管理
- 性能优化:采用组件化和批量处理策略确保良好的运行性能
- 扩展性强:支持添加新怪物类型、配置技能组合和实现召唤单位等扩展需求
该系统为游戏开发提供了坚实的基础,能够满足不同类型怪物的开发需求,同时保持了良好的维护性和扩展性。