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

498 lines
14 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)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts)
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
</cite>
## 目录
1. [概述](#概述)
2. [核心组件架构](#核心组件架构)
3. [技能初始化机制](#技能初始化机制)
4. [技能控制系统](#技能控制系统)
5. [技能数据结构](#技能数据结构)
6. [技能释放流程](#技能释放流程)
7. [技能类型与效果](#技能类型与效果)
8. [开发指引](#开发指引)
9. [常见问题与解决方案](#常见问题与解决方案)
10. [总结](#总结)
## 概述
本游戏采用基于ECSEntity-Component-System架构的技能系统通过多个核心组件协同工作实现了复杂的技能机制。技能系统支持主动技能、被动技能、技能组合以及自定义技能行为为战斗提供了丰富的策略深度。
## 核心组件架构
```mermaid
classDiagram
class Monster {
+MonModelComp HeroModel
+HeroViewComp HeroView
+BattleMoveComp BattleMove
+hero_init(uuid, node, scale, box_group, is_boss, is_call, strength_multiplier)
+load(pos, scale, uuid, is_boss, is_call, strengthMultiplier)
}
class SkillConComp {
+HeroView HeroView
+HeroEntity HeroEntity
+TALCOMP TALCOMP
+skill_cd number
+update(dt)
+castSkill(config)
+doSkill(config, is_wfuny, dmg)
+selectTargets(t_num)
}
class SkillEnt {
+load(startPos, parent, uuid, targetPos, caster, dmg)
+destroy()
}
class HeroViewComp {
+skills any[]
+mp number
+hp number
+Attrs any[]
+playSkillEffect(skill_id)
+do_atked(remainingDamage, CAttrs, s_uuid)
}
class SkillSet {
+uuid number
+name string
+SType SType
+TGroup TGroup
+ap number
+cd number
+cost number
}
Monster --> SkillConComp : "包含"
SkillConComp --> HeroViewComp : "控制"
SkillConComp --> SkillEnt : "创建"
SkillEnt --> SkillViewCom : "加载"
HeroViewComp --> SkillSet : "使用配置"
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L111)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L780)
## 技能初始化机制
### hero_init方法详解
`hero_init`方法是技能初始化的核心入口,负责根据英雄配置动态创建技能实例并设置各项参数。
```mermaid
flowchart TD
A["开始 hero_init"] --> B["获取英雄配置"]
B --> C["初始化基础属性"]
C --> D["遍历技能数组"]
D --> E["创建技能对象"]
E --> F["设置UUID、CD、消耗值"]
F --> G["添加到技能列表"]
G --> H["初始化属性系统"]
H --> I["结束"]
E --> E1["uuid: SkillSet[hero.skills[i]].uuid"]
E --> E2["cd_max: SkillSet[hero.skills[i]].cd"]
E --> E3["cost: SkillSet[hero.skills[i]].cost"]
E --> E4["cd: 0"]
```
**图表来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L65-L85)
#### 技能初始化步骤
1. **英雄配置获取**:从`HeroInfo`中获取英雄基础数据
2. **属性基础值设置**:根据强度倍率调整基础属性值
3. **技能数组遍历**逐个处理英雄配置中的技能UUID
4. **技能对象创建**为每个技能创建包含UUID、冷却时间、消耗值的对象
5. **技能列表填充**:将创建的技能对象添加到`HeroView.skills`数组
6. **属性系统初始化**:调用`initAttrs()`初始化完整属性系统
**节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L65-L85)
### 技能配置数据结构
技能配置通过`SkillSet`常量定义,支持多种技能类型和效果:
| 属性 | 类型 | 描述 | 示例值 |
|------|------|------|--------|
| uuid | number | 技能唯一标识符 | 6001, 6005 |
| name | string | 技能显示名称 | "挥击", "火球术" |
| SType | SType | 技能效果类型 | SType.damage, SType.heal |
| TGroup | TGroup | 目标群体类型 | TGroup.Enemy, TGroup.Self |
| ap | number | 攻击力百分比 | 100, 300 |
| cd | number | 冷却时间(秒) | 1, 5 |
| cost | number | 技能消耗值 | 0, 20 |
| hit_num | number | 攻击目标数量 | 1, 3 |
**节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L80-L147)
## 技能控制系统
### SkillConComp组件功能
`SkillConComp`是技能系统的核心控制器,负责技能触发、冷却管理和释放流程。
```mermaid
sequenceDiagram
participant Player as "玩家输入"
participant SkillCon as "SkillConComp"
participant HeroView as "HeroViewComp"
participant SkillEnt as "SkillEnt"
participant SkillView as "SkillViewCom"
Player->>SkillCon : 技能触发请求
SkillCon->>SkillCon : 检查冷却时间
SkillCon->>SkillCon : 检查MP消耗
SkillCon->>SkillCon : castSkill()
SkillCon->>SkillCon : doSkill()
SkillCon->>SkillCon : selectTargets()
SkillCon->>SkillEnt : 创建技能实体
SkillEnt->>SkillView : 加载技能视图
SkillView->>SkillView : 执行技能动画
SkillView->>SkillView : 处理碰撞检测
SkillView->>HeroView : 造成伤害/效果
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L40-L110)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L70)
#### 技能触发机制
技能触发遵循以下优先级和条件:
1. **状态检查**:确保角色未处于眩晕或冰冻状态
2. **冷却检查**技能CD时间超过最大值
3. **资源检查**MP值足够支付技能消耗
4. **类型匹配**:技能类型为伤害类且角色处于攻击状态
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L38-L48)
### 冷却管理系统
```mermaid
flowchart TD
A["update(dt)"] --> B{"游戏状态检查"}
B --> |暂停/未开始| C["跳过更新"]
B --> |正常| D["遍历技能列表"]
D --> E["累积CD时间"]
E --> F{"CD > CD_MAX AND MP >= COST?"}
F --> |是| G["触发技能"]
F --> |否| H["继续等待"]
G --> I["重置CD = 0"]
I --> J["扣除MP"]
J --> K["播放技能效果"]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L38-L48)
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L38-L48)
## 技能数据结构
### SkillSet配置系统
`SkillSet`提供了完整的技能数据结构定义,支持技能的完整生命周期管理。
```mermaid
classDiagram
class SkillConfig {
+uuid : number
+name : string
+sp_name : string
+path : string
+TGroup : TGroup
+SType : SType
+act : string
+DTType : DTType
+DType : DType
+ap : number
+cd : number
+t_num : number
+hit_num : number
+hit : number
+hitcd : number
+speed : number
+cost : number
+with : number
+buffs : BuffConf[]
+neAttrs : NeAttrsConf[]
+info : string
}
class BuffConf {
+buff : Attrs
+BType : BType
+value : number
+time : number
+chance : number
}
class NeAttrsConf {
+neAttrs : NeAttrs
+value : number
+time : number
}
SkillConfig --> BuffConf : "包含"
SkillConfig --> NeAttrsConf : "包含"
```
**图表来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L95-L147)
### 技能类型枚举
| SType值 | 类型名称 | 效果描述 | 使用场景 |
|---------|----------|----------|----------|
| 0 | damage | 造成伤害 | 主要攻击技能 |
| 1 | heal | 治疗效果 | 辅助/回复技能 |
| 2 | shield | 护盾效果 | 防御型技能 |
| 3 | atk_speed | 攻击速度提升 | 增益技能 |
| 4 | power_up | 力量提升 | 战斗强化技能 |
| 5 | ap_up | 攻击力提升 | 输出增强技能 |
| 10 | zhaohuan | 召唤技能 | 召唤物技能 |
| 11 | buff | 通用增益 | 多功能增益技能 |
**节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L35-L50)
## 技能释放流程
### 技能实体创建流程
```mermaid
sequenceDiagram
participant SkillCon as "SkillConComp"
participant ECS as "ECS系统"
participant SkillEnt as "SkillEnt"
participant SkillView as "SkillViewCom"
participant AtkCon as "AtkConCom"
SkillCon->>ECS : 获取SkillEnt实体
ECS-->>SkillCon : 返回SkillEnt实例
SkillCon->>SkillEnt : load(startPos, parent, uuid, targetPos, caster, dmg)
SkillEnt->>SkillEnt : 验证技能配置
SkillEnt->>SkillEnt : 加载技能预制体
SkillEnt->>SkillEnt : 设置节点属性
SkillEnt->>SkillView : 添加SkillViewCom组件
SkillView->>SkillView : 初始化技能参数
SkillView->>SkillView : 创建AtkConCom实例
SkillView->>AtkCon : 配置攻击组件
AtkCon->>AtkCon : 执行具体技能逻辑
```
**图表来源**
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L70)
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L60-L120)
### 目标选择算法
技能系统实现了智能的目标选择机制,支持多种目标选择策略:
```mermaid
flowchart TD
A["开始目标选择"] --> B{"是否有目标实体?"}
B --> |否| C["返回默认位置"]
B --> |是| D["获取所有目标实体"]
D --> E["第一个目标:最前排"]
E --> F["后续目标:随机选择"]
F --> G["返回目标坐标数组"]
E --> E1["计算最前排位置"]
E1 --> E2["选择最近的实体"]
F --> F1["随机选择实体"]
F1 --> F2["重复选择可重复"]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L115-L150)
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L115-L150)
## 技能类型与效果
### 伤害计算机制
技能造成的伤害通过多层计算确定:
```mermaid
flowchart TD
A["基础攻击力"] --> B["应用技能AP比例"]
B --> C["计算最终伤害"]
C --> D{"是否暴击?"}
D --> |是| E["应用暴击伤害倍率"]
D --> |否| F["普通伤害"]
E --> G["应用穿透效果"]
F --> G
G --> H["应用护盾吸收"]
H --> I["最终伤害值"]
G --> G1["计算穿透衰减"]
G1 --> G2["应用穿透属性"]
H --> H1["检查护盾值"]
H1 --> H2["计算吸收量"]
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L650-L680)
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L130-L160)
### Buff系统集成
技能系统与Buff系统紧密集成支持技能触发Buff效果
| Buff类型 | BType | 效果 | 应用时机 |
|----------|-------|------|----------|
| 数值型 | VALUE | 直接数值加成 | 属性计算时 |
| 百分比型 | RATIO | 百分比加成 | 属性计算时 |
| 持久型 | - | 永久生效 | 持续应用 |
| 临时型 | - | 按时间衰减 | 定时更新 |
**节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L150-L200)
## 开发指引
### 为怪物配置主动技能
1. **编辑heroSet.ts**:在`HeroInfo`中添加怪物配置
2. **配置技能数组**:在`skills`字段中指定技能UUID
3. **调整属性值**根据怪物定位设置HP、MP、AP等属性
4. **测试平衡性**:验证技能冷却和消耗的合理性
### 实现技能组合
```typescript
// 示例:配置多重技能组合
const monsterConfig = {
uuid: 5201,
name: "兽人战士",
skills: [6001, 6005, 6006], // 多个技能
// 其他属性...
};
// 在技能触发时添加组合效果
SkillConComp.prototype.comboSkills = function() {
// 实现技能组合逻辑
// 如:连续使用技能获得额外效果
};
```
### 自定义技能行为
1. **扩展SkillSet**:在`SkillSet`中添加新技能配置
2. **实现特殊效果**:在`AtkConCom`中添加自定义逻辑
3. **注册事件监听**:监听技能触发相关事件
4. **测试兼容性**:确保新技能与现有系统兼容
**节来源**
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L120-L152)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L80-L147)
## 常见问题与解决方案
### 技能同步问题
#### 问题描述
多人游戏中技能释放不同步,导致战斗结果不一致。
#### 解决方案
```mermaid
flowchart TD
A["技能释放请求"] --> B["客户端验证"]
B --> C["发送服务器确认"]
C --> D["服务器验证"]
D --> E{"验证通过?"}
E --> |是| F["广播技能效果"]
E --> |否| G["拒绝请求"]
F --> H["客户端同步显示"]
G --> I["显示错误提示"]
D --> D1["检查冷却时间"]
D --> D2["检查资源充足"]
D --> D3["检查状态允许"]
```
#### 实现要点
1. **服务器端验证**:所有技能释放必须经过服务器验证
2. **延迟补偿**:处理网络延迟导致的技能时间差
3. **状态同步**:确保客户端和服务器状态一致
4. **错误处理**:优雅处理同步失败的情况
### 性能优化建议
#### 技能实体管理
```typescript
// 优化技能实体创建和销毁
class SkillEntityManager {
private pool: SkillEnt[] = [];
createSkill(config: SkillConfig): SkillEnt {
let skill = this.pool.pop();
if (!skill) {
skill = ecs.getEntity<SkillEnt>(SkillEnt);
}
skill.load(...);
return skill;
}
recycleSkill(skill: SkillEnt): void {
skill.reset();
this.pool.push(skill);
}
}
```
#### 冷却时间优化
1. **批量更新**每帧批量处理所有技能的CD更新
2. **优先级调度**:优先处理重要技能的冷却检查
3. **内存池**复用技能对象减少GC压力
### 调试工具
#### 技能日志系统
```typescript
class SkillDebugger {
static logSkillExecution(skillId: number, params: any): void {
console.log(`[Skill] 执行技能 ${skillId}`, {
timestamp: Date.now(),
params,
performance: performance.now()
});
}
static logCooldownUpdate(skillId: number, currentCD: number, maxCD: number): void {
console.log(`[Skill] 技能${skillId}冷却: ${currentCD}/${maxCD}`);
}
}
```
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L40-L60)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L30)
## 总结
本技能系统通过ECS架构实现了高度模块化和可扩展的设计主要特点包括
1. **模块化架构**:各组件职责明确,便于维护和扩展
2. **灵活配置**通过SkillSet实现技能的完全配置化
3. **性能优化**:采用对象池和批量处理提高性能
4. **扩展性强**:支持自定义技能类型和效果
5. **网络友好**:内置同步机制确保多人游戏一致性
该系统为游戏战斗提供了坚实的技术基础,支持复杂技能组合和策略玩法,是构建高质量战斗体验的重要组成部分。