498 lines
14 KiB
Markdown
498 lines
14 KiB
Markdown
# 技能机制
|
||
|
||
<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. [总结](#总结)
|
||
|
||
## 概述
|
||
|
||
本游戏采用基于ECS(Entity-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. **网络友好**:内置同步机制确保多人游戏一致性
|
||
|
||
该系统为游戏战斗提供了坚实的技术基础,支持复杂技能组合和策略玩法,是构建高质量战斗体验的重要组成部分。 |