refactor(game): 移除已弃用的事件常量

- 删除 UpdateHero 和 UpdateFightHero 事件
- 移除 MISSION_UPDATE 事件常量
- 优化游戏事件枚举定义
This commit is contained in:
panw
2025-10-28 16:15:47 +08:00
parent b765e6a7a6
commit 4235e3b776
74 changed files with 31775 additions and 3 deletions

View File

@@ -0,0 +1,492 @@
# 增益/减益状态系统
<cite>
**本文档引用的文件**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
- [timedCom.ts](file://assets/script/game/skill/timedCom.ts)
- [Hero.ts](file://assets/script/game/hero/Hero.ts)
</cite>
## 目录
1. [系统概述](#系统概述)
2. [核心组件架构](#核心组件架构)
3. [状态系统设计](#状态系统设计)
4. [状态持续时间管理](#状态持续时间管理)
5. [视觉反馈机制](#视觉反馈机制)
6. [状态叠加与刷新策略](#状态叠加与刷新策略)
7. [状态特效节点管理](#状态特效节点管理)
8. [生命周期管理](#生命周期管理)
9. [性能优化措施](#性能优化措施)
10. [使用示例与最佳实践](#使用示例与最佳实践)
## 系统概述
增益/减益状态系统是一个复杂的状态管理框架负责管理英雄的各种状态效果包括攻击提升、防御增强、灼烧、冰冻、眩晕等多种状态。该系统采用ECS架构设计通过分离的状态管理组件和视觉反馈组件协同工作实现了高效的状态管理和实时的视觉反馈。
### 主要特性
- **多重叠加支持**:同一属性允许多个增益/减益效果同时存在
- **持久与临时状态**支持永久buff和限时debuff的统一管理
- **类型化属性系统**:区分数值型和百分比型属性的不同计算方式
- **实时视觉反馈**:状态变化时的即时视觉效果展示
- **性能优化**:通过对象池和定时器复用提升系统效率
## 核心组件架构
系统由三个核心组件构成,每个组件承担不同的职责:
```mermaid
classDiagram
class HeroViewComp {
+Record~number,Array~ BUFFS
+Record~number,Array~ BUFFS_TEMP
+Object NeAttrs
+addBuff(buffConf)
+removeBuff(attrIndex, value, isPermanent)
+clearBuffs(attrIndex, isBuff)
+recalculateSingleAttr(attrIndex)
+updateTemporaryBuffsDebuffs(dt)
}
class BuffComp {
+Node top_node
+Node ap_node
+Node cd_node
+Node def_node
+Node hp_node
+Node crit_node
+number ap_cd
+number cd_cd
+number def_cd
+number hp_cd
+number crit_cd
+Timer timer
+hp_show(hp, hp_max)
+mp_show(mp, mp_max)
+show_shield(shield, shield_max)
+show_do_buff(name)
+in_iced(t, ap)
+in_fired(t, ap)
+in_yun(t, ap)
}
class timedCom {
+number time
+number cd
+number ap
+update(deltaTime)
}
HeroViewComp --> BuffComp : "管理视觉反馈"
HeroViewComp --> timedCom : "创建临时状态"
BuffComp --> timedCom : "管理特效节点"
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L44-L84)
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L0-L46)
- [timedCom.ts](file://assets/script/game/skill/timedCom.ts#L0-L24)
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L44-L84)
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L0-L46)
## 状态系统设计
### 数据结构设计
系统采用统一的数组设计模式,支持多种类型的状态管理:
```mermaid
erDiagram
HeroViewComp {
Record BUFFS
Record BUFFS_TEMP
Object NeAttrs
}
BuffConf {
Attrs buff
BType BType
number value
number time
number chance
}
BuffInstance {
number value
BType BType
number remainTime
}
NeAttrInstance {
number value
number time
}
HeroViewComp ||--o{ BuffInstance : "管理"
BuffConf ||--|| BuffInstance : "转换为"
HeroViewComp ||--o{ NeAttrInstance : "管理负面状态"
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L20-L47)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L80-L90)
### 属性类型系统
系统定义了两种属性类型,每种类型采用不同的计算方式:
| 属性类型 | 描述 | 计算公式 | 示例 |
|---------|------|----------|------|
| 数值型 (VALUE) | 直接加减绝对数值 | `(基础值 + 所有数值型buff之和) × (1 + 所有百分比buff之和/100)` | 攻击力、防御力、生命值 |
| 百分比型 (RATIO) | 按百分比计算 | 基础值 + 所有数值型buff之和 + 所有百分比buff之和 | 暴击率、闪避率、伤害加成 |
**章节来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L142-L226)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L251-L320)
## 状态持续时间管理
### cd字段族系统
系统通过专门的cd字段族来管理各种状态的持续时间
```mermaid
flowchart TD
A[状态触发] --> B{判断状态类型}
B --> |增益状态| C[设置ap_cd字段]
B --> |减益状态| D[设置deap_cd字段]
C --> E[启动计时器]
D --> F[启动计时器]
E --> G[更新视觉反馈]
F --> G
G --> H{计时结束?}
H --> |否| I[继续监控]
H --> |是| J[清除状态]
I --> G
J --> K[更新属性计算]
```
**图表来源**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L15-L30)
### 定时器更新机制
系统采用帧更新的方式管理状态持续时间:
```mermaid
sequenceDiagram
participant Game as "游戏主循环"
participant Hero as "HeroViewComp"
participant Timer as "updateTemporaryBuffsDebuffs"
participant Buff as "状态容器"
Game->>Hero : update(deltaTime)
Hero->>Timer : 调用定时器更新
Timer->>Buff : 遍历BUFFS_TEMP
loop 每个临时buff
Buff->>Buff : remainTime -= deltaTime
alt remainTime <= 0
Buff->>Buff : 从数组移除
Buff->>Hero : 标记属性受影响
end
end
Timer->>Hero : 重新计算受影响属性
Hero->>Game : 状态更新完成
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L350-L400)
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L350-L400)
## 视觉反馈机制
### UI同步逻辑
系统通过专门的方法管理UI元素的显示状态
```mermaid
flowchart LR
A[状态变化] --> B[调用相应显示方法]
B --> C{状态类型}
C --> |生命值| D[hp_show方法]
C --> |魔法值| E[mp_show方法]
C --> |护盾| F[show_shield方法]
C --> |特殊效果| G[show_do_buff方法]
D --> H[更新进度条]
E --> H
F --> H
G --> I[创建特效节点]
H --> J[延迟更新确保同步]
I --> K[设置位置和时间]
J --> L[视觉反馈完成]
K --> L
```
**图表来源**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L60-L120)
### 特效节点管理
系统支持动态创建和销毁状态特效节点:
| 方法名 | 功能 | 参数 | 创建的节点类型 |
|--------|------|------|---------------|
| `show_do_buff` | 显示通用状态特效 | `name: string` | buff_xxx.prefab |
| `in_iced` | 显示冰冻状态特效 | `t: number, ap: number` | buff_iced.prefab |
| `in_fired` | 显示燃烧状态特效 | `t: number, ap: number` | buff_fired.prefab |
| `in_yun` | 显示眩晕状态特效 | `t: number, ap: number` | buff_yun.prefab |
| `dead` | 显示死亡特效 | 无 | dead.prefab |
**章节来源**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L120-L200)
## 状态叠加与刷新策略
### 叠加规则
系统支持同属性多实例叠加,每种状态实例保持独立:
```mermaid
flowchart TD
A[添加新状态] --> B{检查属性是否存在}
B --> |不存在| C[创建新数组]
B --> |存在| D[添加到现有数组]
C --> E[设置状态实例]
D --> E
E --> F{状态类型判断}
F --> |持久| G[BUFFS数组]
F --> |临时| H[BUFFS_TEMP数组]
G --> I[直接添加]
H --> J[添加remainTime字段]
I --> K[重新计算属性]
J --> K
K --> L[触发视觉更新]
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L217-L251)
### 刷新与清除策略
系统提供了多种状态清除机制:
```mermaid
flowchart TD
A[状态清除请求] --> B{清除范围}
B --> |单属性| C[clearBuffsForAttr]
B --> |全属性| D[遍历所有属性]
C --> E{过滤条件}
E --> |增益| F[value > 0]
E --> |减益| G[value < 0]
E --> |全部| H[无条件清除]
F --> I[过滤并保留符合条件的buff]
G --> I
H --> I
I --> J{数组是否为空}
J --> |是| K[删除属性条目]
J --> |否| L[保留数组]
K --> M[重新计算属性]
L --> M
M --> N[更新视觉反馈]
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L421-L459)
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L217-L251)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L421-L459)
## 状态特效节点管理
### 动态创建流程
状态特效节点的创建遵循统一的流程:
```mermaid
sequenceDiagram
participant System as "状态系统"
participant Manager as "BuffComp"
participant Resource as "资源管理器"
participant Scene as "场景节点"
participant Timed as "timedCom组件"
System->>Manager : 请求创建特效
Manager->>Resource : 获取预制体资源
Resource-->>Manager : 返回Prefab对象
Manager->>Manager : instantiate(prefab)
Manager->>Scene : 设置父节点
Manager->>Manager : setPosition(position)
alt 临时状态特效
Manager->>Timed : 设置时间参数
Timed->>Timed : 启动定时器
Timed->>Scene : 自动销毁
end
Manager-->>System : 特效创建完成
```
**图表来源**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L120-L180)
- [timedCom.ts](file://assets/script/game/skill/timedCom.ts#L0-L24)
### 销毁机制
临时状态特效通过定时器组件自动销毁:
```mermaid
stateDiagram-v2
[*] --> Created : instantiate()
Created --> Active : setPosition()
Active --> Updating : update(deltaTime)
Updating --> Active : remainTime > 0
Updating --> Destroyed : remainTime <= 0
Destroyed --> [*] : node.destroy()
```
**图表来源**
- [timedCom.ts](file://assets/script/game/skill/timedCom.ts#L15-L24)
**章节来源**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L120-L180)
- [timedCom.ts](file://assets/script/game/skill/timedCom.ts#L0-L24)
## 生命周期管理
### 完整生命周期示例
以冰冻状态为例,展示状态的完整生命周期:
```mermaid
sequenceDiagram
participant Skill as "技能系统"
participant Hero as "HeroViewComp"
participant Buff as "BuffComp"
participant Effect as "特效系统"
participant UI as "UI系统"
Note over Skill,UI : 冰冻状态触发
Skill->>Hero : addBuff(冰冻配置)
Hero->>Hero : 添加到BUFFS_TEMP
Hero->>Hero : recalculateSingleAttr(DEF)
Hero->>Buff : in_iced(duration, ap)
Buff->>Effect : 创建buff_iced特效
Effect->>Effect : 设置remainTime
Buff->>UI : 更新防御显示
UI-->>Buff : 视觉反馈确认
loop 每帧更新
Hero->>Hero : updateTemporaryBuffsDebuffs(dt)
Hero->>Hero : 减少remainTime
alt remainTime <= 0
Hero->>Hero : 从BUFFS_TEMP移除
Hero->>Hero : recalculateSingleAttr(DEF)
Hero->>Buff : 清除特效
Hero->>UI : 更新防御显示
end
end
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L217-L251)
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L150-L170)
### 状态移除流程
系统提供了多种状态移除方式:
| 移除方式 | 触发条件 | 影响范围 | 性能影响 |
|----------|----------|----------|----------|
| 自然消失 | remainTime <= 0 | 单个状态 | 低 |
| 主动清除 | clearBuffs() | 指定属性 | 中等 |
| 类型过滤清除 | clearBuffs(attrIndex, isBuff) | 指定属性和类型 | 中等 |
| 全部清除 | clearAllNeAttrs() | 所有负面状态 | 高 |
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L385-L425)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L457-L500)
## 性能优化措施
### 对象池应用
虽然当前实现中没有显式的对象池,但系统设计考虑了以下优化点:
1. **定时器复用**使用统一的Timer实例管理多个状态的计时
2. **数组操作优化**采用splice而非filter进行状态移除
3. **批量属性计算**通过Set记录受影响属性避免重复计算
### 内存管理策略
```mermaid
flowchart TD
A[状态添加] --> B[检查内存使用]
B --> C{超出阈值?}
C --> |否| D[正常添加]
C --> |是| E[触发垃圾回收]
E --> F[清理无效状态]
F --> G[压缩数组结构]
G --> D
D --> H[更新统计信息]
H --> I[监控内存使用]
```
### 更新频率优化
系统采用智能更新策略:
- **暂停检测**:在游戏暂停时跳过状态更新
- **属性变更追踪**:只重新计算受影响的属性
- **延迟更新**使用scheduleOnce确保UI同步
**章节来源**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L40-L50)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L470-L490)
## 使用示例与最佳实践
### 基本使用模式
```typescript
// 添加攻击提升buff
const attackBuff: BuffConf = {
buff: Attrs.AP,
BType: BType.VALUE,
value: 50,
time: 10,
chance: 100
};
hero.addBuff(attackBuff);
// 添加百分比伤害加成
const damageBuff: BuffConf = {
buff: Attrs.AP,
BType: BType.RATIO,
value: 20,
time: 5,
chance: 80
};
hero.addBuff(damageBuff);
// 清除特定属性的所有增益
hero.clearBuffs(Attrs.AP, true);
// 清除所有负面状态
hero.clearAllNeAttrs();
```
### 最佳实践建议
1. **状态优先级管理**:合理安排状态的添加顺序
2. **性能监控**:定期检查状态数量,避免过多叠加
3. **视觉反馈同步**确保状态变化时UI及时更新
4. **内存泄漏预防**:及时清理不再需要的状态
5. **状态冲突处理**:避免相同属性的相互抵消
### 常见问题解决
| 问题 | 原因 | 解决方案 |
|------|------|----------|
| 状态不消失 | remainTime未正确更新 | 检查updateTemporaryBuffsDebuffs调用 |
| UI显示异常 | 视觉反馈未触发 | 确认BuffComp相关方法被调用 |
| 性能下降 | 状态数量过多 | 实施状态数量限制和定期清理 |
| 内存泄漏 | 特效节点未销毁 | 检查timedCom组件的自动销毁机制 |
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L44-L84)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L80-L90)

View File

@@ -0,0 +1,581 @@
# 天赋系统
<cite>
**本文档中引用的文件**
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
</cite>
## 目录
1. [简介](#简介)
2. [系统架构](#系统架构)
3. [天赋配置结构](#天赋配置结构)
4. [天赋组件系统](#天赋组件系统)
5. [天赋触发机制](#天赋触发机制)
6. [天赋与系统交互](#天赋与系统交互)
7. [扩展新天赋类型](#扩展新天赋类型)
8. [实现示例](#实现示例)
9. [性能优化](#性能优化)
10. [总结](#总结)
## 简介
天赋系统是游戏中的核心成长机制之一,为英雄提供独特的特殊能力和特性。该系统采用配置驱动的方式,通过精心设计的数据结构和组件架构,实现了灵活的天赋配置、智能的触发机制和高效的性能表现。
天赋系统的主要特点包括:
- **多样化触发条件**:支持等级、行为计数、受伤次数等多种触发方式
- **丰富的效果类型**:涵盖属性修改、技能触发、天赋增强等多重效果
- **智能堆叠机制**:支持效果堆叠和最大层数限制
- **无缝集成**:与属性系统、技能系统深度集成,形成完整的成长体系
## 系统架构
天赋系统采用模块化的架构设计,主要由以下几个核心组件构成:
```mermaid
graph TB
subgraph "配置层"
TalSet[TalSet.ts<br/>天赋配置文件]
HeroSet[heroSet.ts<br/>英雄配置]
SkillSet[SkillSet.ts<br/>技能配置]
end
subgraph "组件层"
TalComp[TalComp.ts<br/>天赋组件]
HeroView[HeroViewComp.ts<br/>英雄视图组件]
SkillCon[SkillConComp.ts<br/>技能控制组件]
end
subgraph "系统层"
AttrSys[属性系统]
BuffSys[Buff系统]
ECS[ECS架构]
end
TalSet --> TalComp
HeroSet --> TalComp
SkillSet --> TalComp
TalComp --> HeroView
TalComp --> SkillCon
HeroView --> AttrSys
HeroView --> BuffSys
ECS --> TalComp
```
**图表来源**
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L1-L116)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L1-L171)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L140-L160)
**章节来源**
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L1-L116)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L1-L171)
## 天赋配置结构
### 天赋类型枚举
天赋系统定义了七种基本触发类型,每种类型对应不同的触发条件:
```mermaid
classDiagram
class TalType {
+LEVEL : 1
+LEVEL_UP : 2
+ACTION_COUNT : 3
+SKILL_COUNT : 4
+DAMAGE_COUNT : 5
+INIT : 6
+DEAD : 7
}
class TalEType {
+ATTRS : 1
+SKILL : 2
+SKILL_MORE : 3
}
class ItalConf {
+uuid : number
+name : string
+desc : string
+type : TalType
+triggerType : TalEType
+chance : number
+t_value : number
+e_value : number
+e_name : number
+e_type : BType
+e_scaling : number
+e_count : number
+stackable : boolean
+maxStack : number
}
TalType --> ItalConf
TalEType --> ItalConf
```
**图表来源**
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L10-L35)
### 天赋配置表结构
天赋配置采用紧凑的二维表格式,每行包含注释和配置对象:
| 配置项 | 类型 | 描述 | 示例 |
|--------|------|------|------|
| uuid | number | 天赋唯一标识符 | 7001 |
| name | string | 天赋名称 | "剑意提升" |
| desc | string | 天赋描述 | "每升5级攻击力增加10%" |
| type | TalType | 触发类型 | LEVEL_UP |
| triggerType | TalEType | 效果类型 | ATTRS |
| chance | number | 触发概率 | 100 |
| t_value | number | 触发阈值 | 5 |
| e_value | number | 效果值 | 0.10 |
| e_name | number | 效果属性类型 | Attrs.AP |
| e_type | BType | 效果类型 | RATIO |
| e_scaling | number | 缩放系数 | 1 |
| e_count | number | 触发次数 | 1 |
| stackable | boolean | 是否可堆叠 | true |
| maxStack | number | 最大堆叠层数 | 10 |
### 天赋树结构
天赋树按照英雄类型进行分类,每个英雄可以拥有多个天赋:
```mermaid
graph TD
subgraph "刘邦 - 战士"
L1[剑意提升<br/>每5级+10%攻击力]
L2[霸王之威<br/>初始+100生命值]
L3[离骚诗韵<br/>每8次攻击触发技能]
end
subgraph "赵武灵王 - 远程"
Z1[胡服骑射<br/>每3级+5%攻击速度]
end
subgraph "张良 - 法师"
Z2[运筹帷幄<br/>每4级+8%魔法攻击力]
end
subgraph "萧何 - 辅助"
X1[后勤保障<br/>每6级+3生命回复]
end
L1 --> L2
L1 --> L3
Z1 --> Z2
Z2 --> X1
```
**图表来源**
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L60-L120)
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L75-L115)
**章节来源**
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L10-L116)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L60-L120)
## 天赋组件系统
### 组件架构设计
天赋组件采用ECS架构模式继承自CCComp基类负责管理英雄的天赋系统
```mermaid
classDiagram
class TalComp {
-heroView : any
-skillCon : any
-heroUuid : number
-FStats : FightStats
-activeTals : TalEffect[]
-talEffects : ItalConf[]
-isInitialized : boolean
+start()
+initializeTalents()
+getHeroTalents()
+doTalEffect(tal)
+checkTrigger(tal)
+checkHasTal(type)
+onAction()
+onSkillUse()
+onDamageTaken()
+onLevelUp(level)
+onDeath()
+reset()
}
class FightStats {
+aCount : number
+sCount : number
+dCount : number
+level : number
}
class TalEffect {
+uuid : number
+stack : number
+lTTime : number
}
TalComp --> FightStats
TalComp --> TalEffect
```
**图表来源**
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L28-L171)
### 组件生命周期
天赋组件的生命周期管理确保了正确的初始化和状态维护:
```mermaid
sequenceDiagram
participant Node as 节点
participant TalComp as 天赋组件
participant HeroView as 英雄视图
participant HeroInfo as 英雄配置
Node->>TalComp : start()
TalComp->>HeroView : 获取组件引用
TalComp->>HeroView : 获取英雄UUID
TalComp->>HeroInfo : 查询英雄天赋
HeroInfo-->>TalComp : 返回天赋配置
TalComp->>TalComp : 初始化触发统计
TalComp->>TalComp : 设置初始化标志
TalComp-->>Node : 初始化完成
```
**图表来源**
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L59-L75)
**章节来源**
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L28-L171)
## 天赋触发机制
### 触发条件检测
天赋系统实现了智能的触发条件检测机制,支持多种触发类型的精确匹配:
```mermaid
flowchart TD
Start([开始触发检测]) --> GetType{获取天赋类型}
GetType --> Level{LEVEL?}
GetType --> LevelUp{LEVEL_UP?}
GetType --> Action{ACTION_COUNT?}
GetType --> Skill{SKILL_COUNT?}
GetType --> Damage{DAMAGE_COUNT?}
GetType --> Init{INIT?}
GetType --> Dead{DEAD?}
Level --> LevelCheck{等级 >= 阈值?}
LevelUp --> LevelUpCheck{等级 % 阈值 == 0?}
Action --> ActionCheck{攻击次数 >= 阈值?}
Skill --> SkillCheck{技能使用次数 >= 阈值?}
Damage --> DamageCheck{受伤次数 >= 阈值?}
Init --> True[返回true]
Dead --> False[返回false]
LevelCheck --> |是| Trigger[触发天赋]
LevelCheck --> |否| NoTrigger[不触发]
LevelUpCheck --> |是| Trigger
LevelUpCheck --> |否| NoTrigger
ActionCheck --> |是| Trigger
ActionCheck --> |否| NoTrigger
SkillCheck --> |是| Trigger
SkillCheck --> |否| NoTrigger
DamageCheck --> |是| Trigger
DamageCheck --> |否| NoTrigger
Trigger --> Effect[执行天赋效果]
NoTrigger --> End([结束])
Effect --> End
True --> End
False --> End
```
**图表来源**
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L105-L125)
### 效果执行机制
天赋效果的执行遵循统一的处理流程,根据效果类型调用相应的处理函数:
```mermaid
sequenceDiagram
participant TalComp as 天赋组件
participant HeroView as 英雄视图
participant SkillCon as 技能控制
participant BuffSys as Buff系统
TalComp->>TalComp : 检查天赋效果类型
alt 属性修改 (ATTRS)
TalComp->>BuffSys : 创建Buff配置
TalComp->>HeroView : addBuff(buffConf)
HeroView->>HeroView : 应用属性加成
else 技能触发 (SKILL)
TalComp->>SkillCon : doSkill(skill, false, 0)
SkillCon->>SkillCon : 执行技能逻辑
else 天赋增强 (SKILL_MORE)
TalComp->>HeroView : 添加新技能
HeroView->>HeroView : 更新技能列表
end
```
**图表来源**
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L85-L105)
**章节来源**
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L105-L171)
## 天赋与系统交互
### 与属性系统的集成
天赋系统与属性系统深度集成通过Buff机制实现属性加成
```mermaid
graph LR
subgraph "天赋系统"
TalConf[天赋配置]
TalEffect[天赋效果]
end
subgraph "属性系统"
AttrCalc[属性计算]
BuffMgmt[Buff管理]
AttrApply[属性应用]
end
subgraph "英雄实体"
HeroAttrs[英雄属性]
BaseAttrs[基础属性]
end
TalConf --> TalEffect
TalEffect --> BuffMgmt
BuffMgmt --> AttrCalc
AttrCalc --> AttrApply
AttrApply --> HeroAttrs
HeroAttrs --> BaseAttrs
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L180-L220)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L85-L95)
### 与技能系统的交互
天赋系统与技能系统协同工作,支持技能触发和技能增强:
| 交互类型 | 天赋效果 | 技能系统响应 | 实现方式 |
|----------|----------|--------------|----------|
| 技能触发 | 触发指定技能 | 执行技能逻辑 | SkillCon.doSkill() |
| 技能增强 | 增加额外技能 | 更新技能列表 | HeroView.skills.push() |
| 技能冷却 | 影响技能冷却 | 调整CD计算 | 技能系统集成 |
**章节来源**
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L95-L105)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L28-L40)
## 扩展新天赋类型
### 新增触发类型
要扩展新的触发类型,需要修改以下部分:
1. **添加新的触发类型枚举**
```typescript
export enum TalType {
// 现有类型...
CUSTOM_TRIGGER = 8, // 新增自定义触发类型
}
```
2. **更新触发检测逻辑**
```typescript
case TalType.CUSTOM_TRIGGER:
return this.customTriggerCondition();
```
3. **实现自定义触发条件**
```typescript
private customTriggerCondition(): boolean {
// 实现自定义触发逻辑
return customConditionMet;
}
```
### 新增效果类型
扩展新的效果类型需要:
1. **添加效果类型枚举**
```typescript
export enum TalEType {
// 现有效果类型...
NEW_EFFECT = 4, // 新增效果类型
}
```
2. **更新效果处理逻辑**
```typescript
if (tal.triggerType == TalEType.NEW_EFFECT) {
this.handleNewEffect(tal);
}
```
3. **实现效果处理函数**
```typescript
private handleNewEffect(tal: ItalConf): void {
// 实现新效果处理逻辑
}
```
### 配置新天赋
新增天赋的配置格式保持一致:
```typescript
// 新天赋 - 英雄名称 | 触发条件 | 效果描述
newTalentId: {uuid: newTalentId, name: "新天赋名称", desc: "效果描述",
type: TalType.CUSTOM_TRIGGER, triggerType: TalEType.NEW_EFFECT,
chance: 100, t_value: threshold, e_value: effectValue,
e_name: specialValue, e_type: BType.VALUE, e_scaling: 1,
e_count: 1, stackable: true, maxStack: 5},
```
## 实现示例
### 天赋选择界面实现
天赋选择界面需要与后端逻辑紧密配合:
```mermaid
sequenceDiagram
participant UI as 界面组件
participant TalentMgr as 天赋管理器
participant Backend as 后端服务
participant Hero as 英雄实体
UI->>TalentMgr : 请求可用天赋
TalentMgr->>Backend : 查询天赋数据
Backend-->>TalentMgr : 返回天赋列表
TalentMgr-->>UI : 显示天赋选项
UI->>TalentMgr : 选择天赋
TalentMgr->>Backend : 提交天赋选择
Backend->>Backend : 验证选择合法性
Backend->>Hero : 应用天赋效果
Hero->>Hero : 更新属性和状态
Backend-->>TalentMgr : 确认选择成功
TalentMgr-->>UI : 更新界面状态
```
### 天赋点分配系统
天赋点分配系统的核心实现:
```typescript
// 天赋点分配接口
interface TalentPointAllocation {
heroUuid: number;
selectedTalents: number[];
pointsSpent: number;
validateAllocation(): boolean;
applyAllocation(): void;
}
// 天赋点分配验证逻辑
class TalentValidator {
private validateTalentCompatibility(talents: number[]): boolean {
// 验证天赋兼容性
return this.checkMutualExclusivity(talents) &&
this.validatePrerequisites(talents);
}
private checkMutualExclusivity(talents: number[]): boolean {
// 检查互斥天赋冲突
return !this.hasConflictingTalents(talents);
}
}
```
### 状态持久化
天赋系统的状态持久化确保玩家进度的安全存储:
```mermaid
graph TB
subgraph "客户端"
LocalStorage[本地存储]
Cache[内存缓存]
end
subgraph "服务器"
Database[(数据库)]
API[后端API]
end
subgraph "同步机制"
SyncLogic[同步逻辑]
ConflictResolve[冲突解决]
end
Cache --> SyncLogic
SyncLogic --> API
API --> Database
Database --> API
API --> SyncLogic
SyncLogic --> ConflictResolve
ConflictResolve --> Cache
LocalStorage --> Cache
Cache --> LocalStorage
```
## 性能优化
### 触发检测优化
天赋系统采用多种优化策略提升性能:
1. **延迟初始化**:只在需要时初始化天赋组件
2. **触发条件缓存**:缓存频繁检查的触发条件
3. **批量处理**:将多个天赋效果合并处理
### 内存管理
```typescript
// 内存优化策略
class TalentMemoryManager {
private static readonly MAX_ACTIVE_TALENTS = 20;
cleanupInactiveTalents(): void {
if (this.activeTals.length > TalentMemoryManager.MAX_ACTIVE_TALENTS) {
this.activeTals.sort((a, b) => b.lTTime - a.lTTime);
this.activeTals = this.activeTals.slice(0, TalentMemoryManager.MAX_ACTIVE_TALENTS);
}
}
recycleTalentInstances(): void {
// 回收不再使用的天赋实例
this.activeTals = this.activeTals.filter(tal => tal.stack > 0);
}
}
```
### 计算优化
天赋系统的计算优化主要体现在属性重计算的频率控制上:
```mermaid
flowchart TD
AttrChange[属性变化] --> CheckFreq{检查计算频率}
CheckFreq --> |高频变化| BatchCalc[批量计算]
CheckFreq --> |低频变化| ImmediateCalc[立即计算]
BatchCalc --> DelayedRecalc[延迟重计算]
ImmediateCalc --> DirectUpdate[直接更新]
DelayedRecalc --> FinalAttr[最终属性值]
DirectUpdate --> FinalAttr
```
## 总结
天赋系统作为游戏成长机制的核心组成部分,通过精心设计的架构和灵活的配置系统,为玩家提供了丰富而深入的游戏体验。系统的主要优势包括:
1. **高度可配置性**:通过配置文件实现天赋的灵活定义和调整
2. **智能触发机制**:支持多种触发条件和精确的效果执行
3. **系统集成度高**:与属性系统、技能系统无缝协作
4. **良好的扩展性**:易于添加新的天赋类型和效果
5. **优秀的性能表现**:通过多种优化策略确保流畅的游戏体验
未来的改进方向包括:
- 增强天赋树的可视化展示
- 实现天赋组合的动态平衡
- 添加天赋效果的实时预览功能
- 优化大量天赋场景下的性能表现
天赋系统的设计理念体现了游戏开发中的模块化思维和配置驱动开发的优势,为构建复杂的游戏成长体系提供了可靠的技术基础。

View File

@@ -0,0 +1,390 @@
# 多段连发技能执行机制深度解析
<cite>
**本文档引用的文件**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts)
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts)
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
</cite>
## 目录
1. [引言](#引言)
2. [WFUNY属性机制概述](#wfuny属性机制概述)
3. [核心组件架构](#核心组件架构)
4. [check_wfuny概率触发机制](#check_wfuny概率触发机制)
5. [递归调度执行模型](#递归调度执行模型)
6. [技能执行链路分析](#技能执行链路分析)
7. [ECS实体生成与管理](#ecs实体生成与管理)
8. [定时器延迟加载机制](#定时器延迟加载机制)
9. [节点有效性检查机制](#节点有效性检查机制)
10. [性能优化与风险控制](#性能优化与风险控制)
11. [总结](#总结)
## 引言
本系统实现了一套基于WFUNY属性的概率性多段技能连发机制通过随机数与英雄属性的比较实现技能触发概率控制配合递归调度和ECS实体管理构建了一个完整的技能执行流水线。该机制不仅支持技能连续释放效果还通过多重验证确保异步执行的安全性。
## WFUNY属性机制概述
WFUNY属性作为系统的核心概率控制因子定义了技能连发的基础触发概率。该属性属于百分比型属性其数值直接影响技能连发的成功概率。
```mermaid
classDiagram
class HeroAttrs {
+WFUNY : number
+check_wfuny() boolean
+calculateAttributeGains() object
}
class SkillConComp {
+check_wfuny() boolean
+castSkill() void
+doSkill() void
-_timers : object
}
class SkillEnt {
+load() void
+destroy() void
}
HeroAttrs --> SkillConComp : "提供WFUNY属性"
SkillConComp --> SkillEnt : "创建技能实体"
```
**图表来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L40-L45)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L95-L104)
**章节来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L40-L45)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L95-L104)
## 核心组件架构
系统采用ECS架构模式主要包含以下核心组件
### 技能控制器组件 (SkillConComp)
负责技能的整体调度和生命周期管理,维护定时器集合和技能状态。
### 技能实体 (SkillEnt)
作为ECS实体封装技能的完整生命周期包括特效加载、参数传递和资源管理。
### 技能视图组件 (SkillViewCom)
处理技能的视觉表现和动画控制,协调技能的执行时机和效果展示。
### 攻击组件 (AtkConCom)
实现具体的伤害计算和碰撞检测逻辑,支持多种攻击模式和伤害类型。
```mermaid
graph TB
subgraph "技能执行流水线"
A[技能触发] --> B[check_wfuny概率检查]
B --> C{是否满足连发条件}
C --> |是| D[scheduleOnce递归调度]
C --> |否| E[doSkill执行]
D --> F[doSkill递归调用]
F --> G[技能实体创建]
G --> H[特效播放]
H --> I[伤害计算]
end
subgraph "ECS实体管理"
J[SkillEnt实体] --> K[SkillViewCom组件]
K --> L[AtkConCom组件]
L --> M[碰撞检测]
end
E --> G
I --> N[目标伤害处理]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L58-L110)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L13-L77)
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L35)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L33)
## check_wfuny概率触发机制
`check_wfuny`方法实现了基于随机数的概率触发逻辑,这是整个连发机制的核心判断点。
### 概率计算算法
```mermaid
flowchart TD
A[开始check_wfuny] --> B[生成0-100的随机数]
B --> C[获取WFUNY属性值]
C --> D{random < WFUNY?}
D --> |是| E[返回true - 触发连发]
D --> |否| F[返回false - 不触发连发]
E --> G[继续技能连发]
F --> H[结束当前技能]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L95-L104)
### 实现细节分析
该方法采用简单的概率判断逻辑:
1. 生成0-100范围内的随机浮点数
2. 获取英雄的WFUNY属性值
3. 比较随机数与WFUNY值
4. 当随机数小于WFUNY时返回true否则返回false
这种设计确保了技能连发的概率可控,且与英雄属性紧密关联。
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L95-L104)
## 递归调度执行模型
系统采用`scheduleOnce`方法实现递归调度每次调度间隔为0.1秒,形成稳定的技能连发节奏。
### 调度机制流程
```mermaid
sequenceDiagram
participant SC as SkillConComp
participant Timer as scheduleOnce
participant DS as doSkill
participant SE as SkillEnt
participant SV as SkillViewCom
SC->>SC : castSkill触发
SC->>SC : check_wfuny判断
alt WFUNY触发成功
SC->>Timer : scheduleOnce(doSkill, 0.1)
Timer->>DS : 0.1秒后回调
DS->>SC : 递归调用doSkill
SC->>SE : 创建技能实体
SE->>SV : 初始化技能组件
SV->>SV : 执行技能逻辑
else WFUNY触发失败
SC->>DS : 直接执行doSkill
DS->>SE : 创建技能实体
SE->>SV : 初始化技能组件
SV->>SV : 执行技能逻辑
end
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L66-L110)
### 递归安全机制
系统通过以下机制避免无限递归:
1. **概率控制**WFUNY属性限制了连发的概率
2. **条件检查**:每次递归都进行节点有效性验证
3. **状态管理**通过定时器ID管理和清理机制
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L66-L110)
## 技能执行链路分析
技能执行遵循严格的调用链路,确保各组件间的协调工作。
### 主要执行路径
```mermaid
flowchart LR
A[castSkill] --> B[check_wfuny]
B --> C{WFUNY检查}
C --> |成功| D[doSkill + 递归调度]
C --> |失败| E[doSkill + 直接执行]
D --> F[技能实体创建]
E --> F
F --> G[特效播放]
G --> H[目标选择]
H --> I[伤害计算]
I --> J[效果应用]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L58-L110)
### 关键执行步骤
1. **技能触发阶段**`castSkill`方法启动技能执行
2. **概率验证阶段**`check_wfuny`验证连发条件
3. **实体创建阶段**通过ECS框架创建技能实体
4. **特效播放阶段**:播放技能视觉效果
5. **目标选择阶段**:根据技能配置选择目标
6. **伤害计算阶段**:计算并应用伤害效果
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L58-L110)
## ECS实体生成与管理
系统采用ECS架构模式通过SkillEnt实体统一管理技能的生命周期。
### 实体创建流程
```mermaid
classDiagram
class SkillEnt {
+load(startPos, parent, uuid, targetPos, caster, dmg) void
+destroy() void
-init() void
}
class SkillViewCom {
+s_uuid : number
+caster : HeroViewComp
+Attrs : object
+doSkill() void
+move() void
}
class AtkConCom {
+single_damage() void
+onBeginContact() void
+update() void
}
SkillEnt --> SkillViewCom : "添加组件"
SkillViewCom --> AtkConCom : "协作处理"
```
**图表来源**
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L13-L77)
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L13-L155)
### 实体参数传递
SkillEnt.load方法负责将所有必要的参数传递给技能实体
| 参数 | 类型 | 描述 | 用途 |
|------|------|------|------|
| startPos | Vec3 | 技能起始位置 | 确定技能发射点 |
| parent | Node | 父节点 | 设置技能层级关系 |
| uuid | number | 技能唯一标识 | 查找技能配置 |
| targetPos | any[] | 目标位置数组 | 多目标技能支持 |
| caster | HeroViewComp | 施法者组件 | 获取施法者属性 |
| dmg | number | 伤害值 | 支持伤害倍率计算 |
**章节来源**
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L13-L77)
## 定时器延迟加载机制
系统采用setTimeout实现300毫秒的延迟加载确保技能特效完全播放后再开始执行。
### 延迟加载流程
```mermaid
sequenceDiagram
participant SC as SkillConComp
participant Timer as setTimeout
participant SE as SkillEnt
participant SV as SkillViewCom
SC->>SC : doSkill执行
SC->>SC : playSkillEffect播放特效
SC->>Timer : setTimeout(300ms)
Timer->>SC : 300ms后回调
SC->>SE : ecs.getEntity<SkillEnt>()
SC->>SE : load()加载技能
SE->>SV : 初始化技能组件
SV->>SV : 开始技能逻辑
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L66-L110)
### 定时器管理策略
系统维护一个定时器字典每个技能UUID对应一个定时器ID
```typescript
private _timers: { [key: string]: any } = {};
```
这种设计允许:
- 单独管理每个技能的定时器
- 支持技能中断和清理
- 避免定时器泄漏
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L20-L25)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L177)
## 节点有效性检查机制
为了确保异步执行的安全性,系统在多个关键节点实施有效性检查。
### 检查层次结构
```mermaid
flowchart TD
A[技能开始] --> B{this.node有效?}
B --> |否| C[直接返回]
B --> |是| D{this.HeroView有效?}
D --> |否| C
D --> |是| E{HeroView.node有效?}
E --> |否| C
E --> |是| F[继续执行]
F --> G[技能实体创建]
G --> H{再次检查节点}
H --> |否| I[清理资源]
H --> |是| J[执行技能逻辑]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L75-L85)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L78-L85)
### 检查时机分布
1. **技能触发前检查**:验证调用者的有效性
2. **定时器回调检查**:确保延迟执行时对象仍然存在
3. **技能实体创建检查**:验证目标节点的有效性
4. **组件更新检查**:防止已销毁对象的访问
这种多层次的检查机制有效防止了内存泄漏和空指针异常。
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L75-L85)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L78-L85)
## 性能优化与风险控制
### 性能优化策略
1. **ECS架构优势**:组件化设计提高内存利用率
2. **延迟加载**300ms延迟避免立即创建大量对象
3. **定时器复用**:统一管理定时器资源
4. **条件检查**:及时退出无效执行路径
### 风险控制机制
1. **概率限制**WFUNY属性控制连发频率
2. **超时保护**0.1秒间隔避免CPU占用过高
3. **内存管理**:自动清理定时器和销毁实体
4. **异常捕获**:节点有效性检查防止崩溃
### 安全边界设计
```mermaid
graph LR
A[输入验证] --> B[概率控制]
B --> C[定时器管理]
C --> D[节点检查]
D --> E[资源清理]
E --> F[异常处理]
```
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L95-L104)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L177)
## 总结
这套基于WFUNY属性的多段技能连发机制展现了现代游戏开发中复杂系统的设计精髓
1. **概率驱动的动态行为**通过WFUNY属性实现技能连发的概率控制使战斗更具策略性和不确定性
2. **异步执行的安全保障**:多重节点有效性检查确保了异步操作的稳定性
3. **ECS架构的高效利用**:组件化设计提供了良好的扩展性和维护性
4. **资源管理的精细化**:定时器管理和实体生命周期控制体现了对性能的关注
5. **递归调度的巧妙运用**0.1秒间隔的递归调度既保证了流畅性,又避免了性能问题
这套机制不仅实现了技能连发功能,更为复杂的技能系统扩展奠定了坚实基础,是游戏开发中概率性技能系统设计的优秀范例。

View File

@@ -0,0 +1,440 @@
# 技能冷却管理系统
<cite>
**本文档引用的文件**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
</cite>
## 目录
1. [简介](#简介)
2. [系统架构概览](#系统架构概览)
3. [核心组件分析](#核心组件分析)
4. [冷却机制实现](#冷却机制实现)
5. [状态管理与控制流](#状态管理与控制流)
6. [定时器资源管理](#定时器资源管理)
7. [最佳实践指南](#最佳实践指南)
8. [故障排除](#故障排除)
9. [总结](#总结)
## 简介
SkillConComp是游戏技能冷却管理系统的核心组件负责维护和管理角色技能的冷却状态。该系统采用基于update循环的帧累加机制通过精确的时间累积和多重条件判断来实现智能的技能触发逻辑。系统不仅处理技能冷却计算还集成状态检测、资源管理和生命周期控制等功能。
## 系统架构概览
技能冷却管理系统采用分层架构设计,主要由以下层次组成:
```mermaid
graph TB
subgraph "技能冷却系统架构"
A[SkillConComp] --> B[HeroViewComp]
A --> C[SkillSet配置]
A --> D[GameEvent事件]
A --> E[定时器管理]
B --> F[技能列表]
B --> G[状态检测]
B --> H[属性计算]
C --> I[技能配置]
C --> J[冷却参数]
D --> K[战斗结束事件]
D --> L[暂停事件]
E --> M[setTimeout管理]
E --> N[cleanup机制]
end
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L780)
## 核心组件分析
### SkillConComp组件
SkillConComp是技能冷却管理的主要控制器继承自CCComp基类实现了完整的冷却逻辑和生命周期管理。
#### 主要属性和方法
| 属性/方法 | 类型 | 描述 | 默认值 |
|-----------|------|------|--------|
| HeroView | any | 关联的HeroView组件 | null |
| HeroEntity | any | 关联的实体对象 | null |
| TALCOMP | any | 技能组件 | null |
| skill_cd | number | 全局技能冷却 | 0 |
| _timers | object | 定时器集合 | {} |
#### 生命周期管理
```mermaid
sequenceDiagram
participant Init as 初始化阶段
participant Load as 加载阶段
participant Start as 启动阶段
participant Update as 更新循环
participant Destroy as 销毁阶段
Init->>Load : init()
Load->>Start : onLoad()
Start->>Update : start()
Update->>Update : update(dt)
Update->>Destroy : onDestroy()
Destroy->>Init : clear_timer()
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L20-L35)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L160-L177)
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
### HeroViewComp组件
HeroViewComp作为技能状态的承载者提供了技能列表管理和状态查询功能。
#### 技能状态管理
| 状态属性 | 类型 | 描述 | 用途 |
|----------|------|------|------|
| skills | array | 当前技能列表 | 存储技能配置和冷却状态 |
| mp | number | 当前魔法值 | 冷却触发条件之一 |
| is_atking | boolean | 是否处于攻击状态 | 影响技能触发时机 |
**节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L80-L90)
## 冷却机制实现
### 帧累加冷却计算
技能冷却采用基于update循环的帧累加机制每帧将deltaTime累加到技能的当前冷却时间上。
#### 冷却计算流程
```mermaid
flowchart TD
Start([update循环开始]) --> CheckState{检查游戏状态}
CheckState --> |非战斗状态| Skip[跳过冷却计算]
CheckState --> |战斗状态| CheckStun{检查眩晕状态}
CheckStun --> |眩晕中| Skip
CheckStun --> |清醒状态| GetSkills[获取技能列表]
GetSkills --> LoopSkills[遍历技能数组]
LoopSkills --> AddDeltaTime[累加dt到cd]
AddDeltaTime --> CheckConditions{检查触发条件}
CheckConditions --> |cd > cd_max且mp充足| TriggerSkill[触发技能]
CheckConditions --> |不满足条件| NextSkill[下一个技能]
TriggerSkill --> ResetCD[重置冷却时间]
ResetCD --> DeductMP[扣除魔法值]
DeductMP --> NextSkill
NextSkill --> MoreSkills{还有更多技能?}
MoreSkills --> |是| LoopSkills
MoreSkills --> |否| End([循环结束])
Skip --> End
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L37-L55)
#### 双重条件判断逻辑
冷却触发采用严格的双重条件判断机制:
1. **冷却时间条件**`skills[i].cd > skills[i].cd_max`
2. **魔法值条件**`this.HeroView.mp >= skills[i].cost`
只有当这两个条件同时满足时,技能才会被触发。
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L42-L50)
### 技能触发机制
#### 触发条件详解
```mermaid
flowchart TD
A[技能触发检查] --> B{cd > cd_max?}
B --> |否| C[继续冷却]
B --> |是| D{mp >= cost?}
D --> |否| C
D --> |是| E{技能类型检查}
E --> |伤害技能| F{is_atking?}
E --> |其他技能| G[直接触发]
F --> |是| H{SType.damage?}
F --> |否| C
H --> |是| I[触发技能]
H --> |否| C
G --> I
I --> J[重置cd=0]
J --> K[扣除mp]
K --> L[播放特效]
L --> M[执行技能逻辑]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L42-L50)
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L57-L65)
## 状态管理与控制流
### 游戏状态检测
系统通过多个层面的状态检测来决定是否进行冷却计算:
#### 状态检查层次
| 检查层级 | 检查内容 | 实现位置 | 作用 |
|----------|----------|----------|------|
| Mission状态 | `smc.mission.play` | update方法 | 检查整体游戏状态 |
| Pause状态 | `smc.mission.pause` | update方法 | 检查暂停状态 |
| 状态异常 | `this.HeroView.isStun()` | update方法 | 检查眩晕状态 |
| 状态异常 | `this.HeroView.isFrost()` | update方法 | 检查冰冻状态 |
#### 状态检测流程
```mermaid
sequenceDiagram
participant Update as update循环
participant SM as smc.mission
participant HeroView as HeroView
participant Skills as 技能列表
Update->>SM : 检查play状态
SM-->>Update : 返回状态
Update->>SM : 检查pause状态
SM-->>Update : 返回状态
Update->>HeroView : 检查眩晕状态
HeroView-->>Update : 返回状态
Update->>HeroView : 检查冰冻状态
HeroView-->>Update : 返回状态
Update->>Skills : 获取技能列表
Skills-->>Update : 返回技能数组
Update->>Update : 执行冷却计算
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L37-L40)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L465-L470)
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L37-L40)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L465-L470)
### 非战斗状态处理
在非战斗状态下,系统会完全跳过冷却计算,确保资源的有效利用:
#### 非战斗状态判断
```typescript
// 非战斗状态检查逻辑
if(!smc.mission.play || smc.mission.pause) return
```
这种设计避免了在菜单界面、加载画面等非战斗状态下进行不必要的计算开销。
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L37-L40)
## 定时器资源管理
### 定时器生命周期
SkillConComp实现了完整的定时器生命周期管理包括创建、使用和清理三个阶段。
#### 定时器管理架构
```mermaid
graph LR
subgraph "定时器生命周期"
A[创建定时器] --> B[存储到_timers]
B --> C[技能执行]
C --> D[定时器回调]
D --> E[清理定时器]
E --> F[内存释放]
end
subgraph "清理策略"
G[战斗结束] --> H[clear_timer]
I[组件销毁] --> J[onDestroy]
K[手动重置] --> L[reset]
end
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L15-L16)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L155)
#### 定时器清理机制
系统提供了多种定时器清理机制:
| 清理方式 | 触发条件 | 实现方法 | 作用范围 |
|----------|----------|----------|----------|
| 战斗结束清理 | GameEvent.FightEnd | clear_timer() | 所有定时器 |
| 组件销毁清理 | onDestroy() | onDestroy() | 当前组件 |
| 手动重置清理 | reset() | reset() | 当前组件 |
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L155)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L160-L177)
### 资源释放过程
#### 定时器释放流程
```mermaid
sequenceDiagram
participant Event as 战斗结束事件
participant Comp as SkillConComp
participant Timer as 定时器系统
participant Memory as 内存管理
Event->>Comp : GameEvent.FightEnd
Comp->>Comp : clear_timer()
Comp->>Timer : Object.values(_timers).forEach(clearTimeout)
Timer->>Memory : 释放定时器资源
Memory-->>Timer : 确认释放
Timer-->>Comp : 清理完成
Comp->>Comp : _timers = {}
Note over Comp,Memory : 组件销毁时自动清理
Comp->>Comp : onDestroy()
Comp->>Timer : 再次清理所有定时器
Comp->>Comp : 重置_timers对象
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L155)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L160-L177)
**节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L177)
## 最佳实践指南
### 暂停状态下的冷却处理
在游戏暂停状态下,系统会完全跳过冷却计算,这是推荐的最佳实践:
#### 暂停状态处理
```typescript
// 推荐的暂停状态处理
update(dt: number) {
if(!smc.mission.play || smc.mission.pause) return
// 冷却计算逻辑
}
```
这种方式确保了在暂停状态下不会产生额外的计算开销,同时保持了冷却状态的准确性。
### 战斗结束后的清理
战斗结束后必须及时清理定时器资源,避免内存泄漏:
#### 战斗结束清理
```typescript
// 战斗结束事件监听
init(): void {
this.on(GameEvent.FightEnd, this.clear_timer, this);
}
// 清理方法实现
public clear_timer() {
Object.values(this._timers).forEach(clearTimeout);
}
```
### 非play状态的处理
在非战斗状态(如菜单界面)下,系统会自动跳过冷却计算:
#### 非play状态检查
```typescript
// 非play状态检查
if(!smc.mission.play || smc.mission.pause) return
```
这种设计确保了系统只在需要的时候进行计算,提高了整体性能。
## 故障排除
### 常见问题及解决方案
#### 问题1技能冷却不准确
**症状**:技能冷却时间显示不正确
**原因**update循环被中断或dt值异常
**解决方案**
- 检查smc.mission.play状态
- 验证dt参数的有效性
- 确保update方法正常执行
#### 问题2定时器泄漏
**症状**:内存使用持续增长
**原因**:定时器未正确清理
**解决方案**
- 在onDestroy中清理定时器
- 确保GameEvent.FightEnd事件正确触发
- 检查定时器ID的唯一性
#### 问题3技能无法触发
**症状**:技能达到冷却时间但不触发
**原因**:多重条件判断失败
**解决方案**
- 检查mp值是否足够
- 验证is_atking状态
- 确认技能配置正确
### 调试技巧
#### 冷却状态监控
```typescript
// 添加调试日志
update(dt: number) {
console.log(`冷却状态 - play: ${smc.mission.play}, pause: ${smc.mission.pause}`);
console.log(`技能冷却 - 当前mp: ${this.HeroView.mp}`);
}
```
#### 定时器状态检查
```typescript
// 定时器状态监控
public debugTimers() {
console.log('当前定时器:', Object.keys(this._timers));
console.log('定时器数量:', Object.values(this._timers).length);
}
```
## 总结
SkillConComp技能冷却管理系统是一个设计精良的组件具有以下特点
### 核心优势
1. **精确的帧累加机制**基于update循环的冷却计算确保了时间精度
2. **多重条件判断**:双条件触发机制保证了技能使用的合理性
3. **完善的生命周期管理**:从创建到销毁的完整资源管理
4. **灵活的状态控制**:支持各种游戏状态下的冷却处理
### 设计亮点
- **模块化架构**:清晰的职责分离和组件交互
- **资源优化**:智能的状态检查避免不必要的计算
- **错误处理**:完善的异常情况处理机制
- **扩展性**:良好的接口设计支持功能扩展
### 性能考虑
系统通过智能的状态检查和条件判断,有效减少了不必要的计算开销,在保证功能完整性的同时维持了良好的性能表现。
这个技能冷却管理系统为游戏提供了稳定可靠的技能控制机制,是游戏战斗系统的重要组成部分。

View File

@@ -0,0 +1,359 @@
# 技能执行机制
<cite>
**本文档中引用的文件**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
</cite>
## 目录
1. [概述](#概述)
2. [核心组件架构](#核心组件架构)
3. [技能冷却检测机制](#技能冷却检测机制)
4. [技能施放流程](#技能施放流程)
5. [多段连发技能机制](#多段连发技能机制)
6. [目标选择策略](#目标选择策略)
7. [异常处理与资源清理](#异常处理与资源清理)
8. [性能优化考虑](#性能优化考虑)
9. [最佳实践总结](#最佳实践总结)
## 概述
SkillConComp类是游戏技能控制系统的核心组件负责管理英雄的技能冷却、自动施放条件判断以及技能执行流程。该系统采用ECS架构模式结合定时器机制和节点有效性检查实现了复杂的技能逻辑控制。
## 核心组件架构
```mermaid
classDiagram
class SkillConComp {
+HeroView : HeroViewComp
+HeroEntity : any
+TALCOMP : TalComp
+skill_cd : number
-_timers : object
+init() void
+onLoad() void
+start() void
+update(dt : number) void
+castSkill(config : SkillConfig) void
-doSkill(config : SkillConfig, is_wfuny : boolean, dmg : number) void
+check_wfuny() boolean
+selectTargets(t_num : number) Vec3[]
+clear_timer() void
+reset() void
+onDestroy() void
}
class SkillEnt {
+load(startPos : Vec3, parent : Node, uuid : number, targetPos : any[], caster : HeroViewComp, dmg : number) void
+destroy() void
+init() void
}
class HeroViewComp {
+playSkillEffect(skill_id : number) void
+skills : any[]
+mp : number
+is_atking : boolean
+isStun() boolean
+isFrost() boolean
}
class SkillSet {
+SType : enum
+TGroup : enum
+SkillConfig : interface
}
SkillConComp --> HeroViewComp : "控制"
SkillConComp --> SkillEnt : "创建"
SkillConComp --> SkillSet : "使用配置"
SkillEnt --> SkillViewCom : "包含"
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L17-L177)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L14-L78)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L70-L780)
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
## 技能冷却检测机制
### update循环中的冷却检测
SkillConComp的update方法实现了精确的技能冷却管理系统
```mermaid
flowchart TD
Start([update循环开始]) --> CheckMission{"检查游戏状态<br/>smc.mission.play && !pause"}
CheckMission --> |否| End([结束])
CheckMission --> |是| CheckStatus{"检查状态<br/>!isStun && !isFrost"}
CheckStatus --> |否| End
CheckStatus --> |是| LoopSkills["遍历技能列表"]
LoopSkills --> AddCD["累积冷却时间<br/>skills[i].cd += dt"]
AddCD --> CheckCD{"冷却完成<br/>cd > cd_max?"}
CheckCD --> |否| NextSkill["下一技能"]
CheckCD --> |是| CheckMP{"检查魔法值<br/>mp >= cost?"}
CheckMP --> |否| NextSkill
CheckMP --> |是| CheckType{"技能类型<br/>SType.damage?"}
CheckType --> |否| NextSkill
CheckType --> |是| CheckAttack{"正在攻击<br/>is_atking?"}
CheckAttack --> |否| NextSkill
CheckAttack --> |是| CastSkill["调用castSkill"]
CastSkill --> ResetCD["重置冷却<br/>skills[i].cd = 0"]
ResetCD --> ConsumeMP["消耗魔法值<br/>mp -= cost"]
ConsumeMP --> NextSkill
NextSkill --> MoreSkills{"还有技能?"}
MoreSkills --> |是| LoopSkills
MoreSkills --> |否| End
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L35-L52)
### 冷却检测的关键要素
1. **时间累积机制**:每个技能的冷却时间通过`skills[i].cd += dt`逐步累积
2. **阈值判断**:当冷却时间超过最大冷却时间`cd_max`时触发
3. **资源检查**:确保魔法值充足`this.HeroView.mp >= skills[i].cost`
4. **状态验证**:排除眩晕和冰冻状态影响
5. **攻击状态检查**:只有在攻击状态下才允许施放伤害技能
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L35-L52)
## 技能施放流程
### castSkill与doSkill方法调用链
```mermaid
sequenceDiagram
participant Player as "玩家输入/自动触发"
participant SkillCon as "SkillConComp"
participant HeroView as "HeroViewComp"
participant SkillEnt as "SkillEnt"
participant ECS as "ECS系统"
Player->>SkillCon : castSkill(config)
SkillCon->>SkillCon : check_wfuny()
SkillCon->>SkillCon : doSkill(config, wfuny, dmg)
Note over SkillCon : 节点有效性检查
SkillCon->>SkillCon : 检查节点有效性
alt 目标组为Self
SkillCon->>SkillCon : targets = [this.node.position]
else 目标组为Enemy
SkillCon->>SkillCon : selectTargets(config.t_num)
end
SkillCon->>HeroView : playSkillEffect(config.uuid)
HeroView->>HeroView : 播放技能特效
SkillCon->>ECS : ecs.getEntity<SkillEnt>(SkillEnt)
SkillCon->>SkillCon : 创建setTimeout定时器
Note over SkillCon : 延迟执行300ms
SkillCon->>SkillCon : 定时器回调函数
SkillCon->>SkillCon : 再次检查节点有效性
SkillCon->>SkillEnt : sEnt.load(...)
SkillCon->>SkillEnt : load方法
SkillEnt->>SkillEnt : 加载技能预制体
SkillEnt->>SkillEnt : 设置节点属性
SkillEnt->>SkillEnt : 添加SkillViewCom组件
alt wfuny机制启用
SkillCon->>SkillCon : scheduleOnce(doSkill, 0.1)
end
Note over SkillCon : 保存定时器ID
SkillCon->>SkillCon : this._timers[`skill_${config.uuid}`] = timerId
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L54-L85)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L77)
### 节点有效性检查机制
系统实现了双重节点有效性检查:
1. **初始检查**:在`doSkill`方法开头进行基础节点有效性验证
2. **延迟检查**:在定时器回调函数中再次确认节点状态
这种设计确保了即使在技能施放过程中节点被销毁,也不会导致错误操作。
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L54-L85)
## 多段连发技能机制
### wfuny机制实现原理
wfuny机制是一种基于概率的技能连发系统
```mermaid
flowchart TD
Start([doSkill开始]) --> CheckWfuny{"检查wfuny<br/>check_wfuny()"}
CheckWfuny --> |false| NormalSkill["正常技能执行"]
CheckWfuny --> |true| ScheduleOnce["scheduleOnce(doSkill, 0.1)"]
ScheduleOnce --> RecursiveCall["递归调用doSkill<br/>is_wfuny=false"]
RecursiveCall --> CheckWfuny2{"再次检查wfuny"}
CheckWfuny2 --> |false| FinalExecution["最终技能执行"]
CheckWfuny2 --> |true| ContinueRecursion["继续递归"]
ContinueRecursion --> ScheduleOnce
NormalSkill --> SaveTimer["保存定时器ID"]
FinalExecution --> SaveTimer
SaveTimer --> End([结束])
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L82-L87)
### wfuny概率计算
```typescript
check_wfuny() {
let random = Math.random() * 100
if (random < this.HeroView.Attrs[Attrs.WFUNY]) {
return true
}
return false
}
```
该方法:
1. 生成0-100之间的随机数
2. 与英雄的WFUNY属性值比较
3. 当随机数小于WFUNY值时返回true触发连发
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L89-L95)
## 目标选择策略
### selectTargets方法实现
```mermaid
flowchart TD
Start([selectTargets开始]) --> GetEntities["获取目标实体<br/>check_target()"]
GetEntities --> CheckEmpty{"实体列表为空?"}
CheckEmpty --> |是| DefaultPos["返回默认位置<br/>t_num个相同坐标"]
DefaultPos --> Return([返回目标坐标数组])
CheckEmpty --> |否| FindFront["找到最前排目标<br/>get_front(entities)"]
FindFront --> PushFront["targets.push(frontPos)"]
PushFront --> LoopOthers["循环处理剩余目标<br/>i=1 to t_num-1"]
LoopOthers --> SelectRandom["随机选择实体<br/>Math.floor(Math.random() * entities.length)"]
SelectRandom --> GetRandomPos["获取随机实体位置"]
GetRandomPos --> PushRandom["targets.push(randomPos)"]
PushRandom --> MoreTargets{"还有目标?"}
MoreTargets --> |是| LoopOthers
MoreTargets --> |否| Return
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L112-L155)
### 目标选择算法详解
1. **实体获取**:通过`check_target()`方法获取敌方实体列表
2. **前排优先**:第一个目标总是最前排的实体
3. **随机分布**:后续目标从所有可用实体中随机选择
4. **重复可能**:由于随机选择,可能出现重复目标
5. **默认处理**:当没有可用目标时,返回预设的默认位置
### 默认位置处理逻辑
```typescript
const defaultPos = this.HeroView.fac === FacSet.HERO ? v3(400, 0, 0) : v3(-400, 0, 0)
```
系统根据施法者阵营确定默认位置:
- 英雄阵营x=400
- 敌人阵营x=-400
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L112-L155)
## 异常处理与资源清理
### 定时器管理机制
```mermaid
classDiagram
class TimerManagement {
-_timers : object
+clear_timer() void
+reset() void
+onDestroy() void
}
class TimerOperations {
+Object.values(this._timers).forEach(clearTimeout)
+this._timers = {}
+this.off(GameEvent.CastHeroSkill)
}
TimerManagement --> TimerOperations : "执行"
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L157-L177)
### 异常处理策略
1. **节点有效性检查**:在关键操作前后检查节点状态
2. **定时器清理**:确保技能执行完成后清理相关定时器
3. **事件监听移除**:在组件销毁时移除事件监听器
4. **资源释放**在组件销毁时释放ECS实体资源
### 资源清理最佳实践
```typescript
public clear_timer() {
Object.values(this._timers).forEach(clearTimeout);
}
reset() {
this.clear_timer();
}
onDestroy() {
Object.values(this._timers).forEach(clearTimeout);
this._timers = {};
this.off(GameEvent.CastHeroSkill);
}
```
这些方法确保:
- 防止内存泄漏
- 避免僵尸定时器
- 清理事件监听器
- 正确释放ECS资源
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L157-L177)
## 性能优化考虑
### 定时器优化策略
1. **延迟执行**技能实体创建延迟300ms避免立即创建大量对象
2. **条件检查**:在每次操作前进行有效性检查,防止无效操作
3. **批量清理**:使用`Object.values`一次性清理所有定时器
### 内存管理优化
1. **及时清理**:在组件销毁时立即清理所有资源
2. **弱引用**:避免循环引用导致的内存泄漏
3. **对象池**利用ECS系统提供的实体池机制
## 最佳实践总结
### 技能系统设计原则
1. **模块化设计**SkillConComp专注于控制逻辑SkillEnt负责实体管理
2. **事件驱动**通过ECS系统实现松耦合的组件通信
3. **容错机制**:多重节点有效性检查确保系统稳定性
4. **资源管理**:完善的定时器和事件监听器清理机制
### 开发建议
1. **扩展性考虑**:为新的技能类型预留接口
2. **性能监控**:定期检查定时器数量和内存使用情况
3. **调试支持**:保留必要的日志输出便于问题排查
4. **测试覆盖**:确保各种边界情况都有相应的测试用例
这个技能执行机制展现了现代游戏开发中复杂系统的设计精髓,通过合理的架构设计和完善的异常处理,实现了稳定可靠的技能控制系统。

View File

@@ -0,0 +1,506 @@
# 技能执行资源管理
<cite>
**本文档中引用的文件**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts)
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
- [HeroConComp.ts](file://assets/script/game/hero/HeroConComp.ts)
- [timer.md](file://doc/core/common/timer.md)
- [MapView.ts](file://assets/script/game/map/MapView.ts)
</cite>
## 目录
1. [引言](#引言)
2. [项目结构概述](#项目结构概述)
3. [核心组件分析](#核心组件分析)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 引言
在Cocos游戏引擎的战斗系统中技能执行过程中的定时器资源管理是一个关键的系统级问题。本文档深入分析了技能执行过程中定时器资源的创建、存储、清理和生命周期管理策略重点关注`_doSkill`方法中`setTimeout`创建的timerId如何被存储于`_timers`对象中,并通过`clear_timer`方法统一清除的完整流程。
## 项目结构概述
该项目采用基于组件的架构设计,技能系统的核心组件分布在以下目录结构中:
```mermaid
graph TB
subgraph "技能系统架构"
SkillConComp["SkillConComp<br/>技能控制器组件"]
SkillEnt["SkillEnt<br/>技能实体管理"]
HeroViewComp["HeroViewComp<br/>英雄视图组件"]
MissionComp["MissionComp<br/>任务管理组件"]
end
subgraph "事件系统"
GameEvent["GameEvent<br/>游戏事件枚举"]
MessageSystem["消息系统<br/>事件分发"]
end
subgraph "定时器管理"
TimerModule["定时器模块<br/>Oops Framework"]
LocalTimers["_timers对象<br/>本地定时器存储"]
end
SkillConComp --> SkillEnt
SkillConComp --> HeroViewComp
MissionComp --> GameEvent
GameEvent --> MessageSystem
SkillConComp --> LocalTimers
TimerModule --> LocalTimers
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L1-L70)
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L50)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L30)
## 核心组件分析
### SkillConComp - 技能控制器组件
`SkillConComp`是技能系统的核心控制器,负责技能的施放、定时器管理和生命周期控制。该组件维护了一个私有的`_timers`对象用于存储所有技能执行过程中创建的定时器ID。
#### 主要特性:
- **定时器存储管理**:使用`_timers: { [key: string]: any } = {}`对象存储定时器
- **生命周期钩子**:实现了`onDestroy``reset`方法进行资源清理
- **事件监听**:订阅`FightEnd`事件进行自动清理
- **节点有效性检查**:在多个关键点进行节点有效性验证
#### 定时器管理流程:
```mermaid
sequenceDiagram
participant Player as "玩家输入"
participant SkillCon as "SkillConComp"
participant Timer as "setTimeout"
participant TimersObj as "_timers对象"
participant EventSys as "事件系统"
participant Cleanup as "清理机制"
Player->>SkillCon : castSkill()
SkillCon->>SkillCon : doSkill()
SkillCon->>Timer : setTimeout(callback, delay)
Timer-->>SkillCon : timerId
SkillCon->>TimersObj : this._timers[key] = timerId
Note over SkillCon,TimersObj : 定时器创建完成
alt 战斗结束事件触发
EventSys->>SkillCon : FightEnd事件
SkillCon->>Cleanup : clear_timer()
Cleanup->>TimersObj : Object.values(_timers).forEach(clearTimeout)
TimersObj-->>Cleanup : 清理所有定时器
else 组件销毁
SkillCon->>Cleanup : onDestroy()
Cleanup->>TimersObj : Object.values(_timers).forEach(clearTimeout)
Cleanup->>TimersObj : this._timers = {}
end
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L66-L110)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L177)
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L18-L35)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L66-L110)
## 架构概览
技能执行资源管理系统采用多层次的清理策略,确保定时器资源得到妥善管理:
```mermaid
flowchart TD
Start([技能施放开始]) --> ValidateNode["节点有效性检查"]
ValidateNode --> CreateTimer["创建setTimeout定时器"]
CreateTimer --> StoreTimer["存储到_timers对象"]
StoreTimer --> ExecuteSkill["执行技能逻辑"]
ExecuteSkill --> CheckEvent{"战斗结束事件?"}
CheckEvent --> |是| AutoCleanup["自动清理机制"]
CheckEvent --> |否| ContinueExecution["继续执行"]
ContinueExecution --> CheckDestroy{"组件销毁?"}
CheckDestroy --> |是| ManualCleanup["手动清理机制"]
CheckDestroy --> |否| WaitNextFrame["等待下一帧"]
AutoCleanup --> ClearAllTimers["clear_timer()清理所有定时器"]
ManualCleanup --> ClearAllTimers
ClearAllTimers --> ResetTimersObj["重置_timers对象"]
ResetTimersObj --> RemoveListeners["移除事件监听器"]
WaitNextFrame --> CheckEvent
RemoveListeners --> End([资源清理完成])
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L177)
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L80-L95)
## 详细组件分析
### 定时器创建与存储机制
#### doSkill方法中的定时器创建
`doSkill`方法中,技能执行采用了延迟执行模式,通过`setTimeout`创建定时器来延迟技能的实际执行:
```mermaid
classDiagram
class SkillConComp {
-_timers : { [key : string] : any }
+doSkill(config, is_wfuny, dmg)
+clear_timer()
+onDestroy()
+reset()
}
class TimerStorage {
+storeTimer(key, timerId)
+clearAllTimers()
+resetObject()
}
class NodeValidation {
+checkNodeValidity()
+checkHeroViewValidity()
}
SkillConComp --> TimerStorage : "管理"
SkillConComp --> NodeValidation : "验证"
TimerStorage --> NodeValidation : "依赖"
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L66-L110)
#### 定时器存储策略
定时器ID通过键值对形式存储在`_timers`对象中,键名采用`skill_{uuid}`格式,确保唯一性和可追溯性:
| 存储策略 | 优势 | 应用场景 |
|---------|------|----------|
| 键值对存储 | 支持按技能UUID快速查找和清理 | 单个技能的精确清理 |
| 对象引用 | 集合操作支持批量清理 | 批量资源清理 |
| 类型安全 | TypeScript类型约束 | 编译时错误预防 |
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L66-L110)
### 生命周期钩子中的定时器清理
#### onDestroy方法的清理策略
`onDestroy`方法实现了组件销毁时的资源清理,这是防止内存泄漏的最后一道防线:
```mermaid
flowchart LR
OnDestroy[onDestroy触发] --> ClearTimers["Object.values(_timers).forEach(clearTimeout)"]
ClearTimers --> ResetObject["this._timers = {}"]
ResetObject --> RemoveListeners["this.off(GameEvent.CastHeroSkill)"]
RemoveListeners --> Complete[清理完成]
subgraph "清理保护机制"
SafetyCheck["节点有效性检查"]
NullCheck["空值检查"]
TypeGuard["类型守卫"]
end
ClearTimers -.-> SafetyCheck
ClearTimers -.-> NullCheck
ClearTimers -.-> TypeGuard
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L177)
#### reset方法的资源重置
`reset`方法提供了组件重置时的资源清理功能,主要用于组件池化场景:
| 清理阶段 | 操作内容 | 目的 |
|---------|----------|------|
| 定时器清理 | 调用`clear_timer()`方法 | 防止定时器残留 |
| 状态重置 | 重置内部状态变量 | 准备组件复用 |
| 事件解绑 | 解除事件监听器 | 避免内存泄漏 |
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L140-L150)
### FightEnd事件监听机制
#### 战斗结束自动清理触发路径
战斗结束时的自动清理通过事件驱动机制实现,确保所有技能定时器得到及时清理:
```mermaid
sequenceDiagram
participant Hero as "英雄死亡"
participant MissionComp as "MissionComp"
participant MessageSys as "消息系统"
participant SkillCon as "SkillConComp"
participant TimerMgr as "定时器管理器"
Hero->>MissionComp : do_hero_dead()
MissionComp->>MissionComp : 检查英雄数量
alt 英雄全部死亡
MissionComp->>MessageSys : dispatchEvent(FightEnd)
MessageSys->>SkillCon : 触发FightEnd事件
SkillCon->>TimerMgr : clear_timer()
TimerMgr->>TimerMgr : 清理所有定时器
end
```
**图表来源**
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L55-L65)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L20-L25)
#### 事件监听器的注册与管理
`init`方法中注册了`FightEnd`事件监听器,确保战斗结束时能够触发自动清理:
| 监听器类型 | 事件名称 | 回调函数 | 清理时机 |
|-----------|----------|----------|----------|
| 单次监听 | FightEnd | clear_timer | 战斗结束时 |
| 生命周期监听 | onDestroy | 清理所有定时器 | 组件销毁时 |
| 事件解绑 | CastHeroSkill | 移除特定事件监听 | 组件销毁时 |
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L20-L25)
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L55-L65)
### 异常场景下的安全性检查
#### 节点有效性检查实践
在技能执行的关键路径上,实施了多层节点有效性检查,防止因节点被提前销毁而导致的异常:
```mermaid
flowchart TD
EnterMethod[进入方法] --> FirstCheck["首次节点检查"]
FirstCheck --> IsValid1{"节点有效?"}
IsValid1 --> |否| EarlyReturn["提前返回"]
IsValid1 --> |是| ExecuteLogic["执行业务逻辑"]
ExecuteLogic --> SecondCheck["二次节点检查"]
SecondCheck --> IsValid2{"节点仍然有效?"}
IsValid2 --> |否| SafeExit["安全退出"]
IsValid2 --> |是| ContinueExecution["继续执行"]
ContinueExecution --> ThirdCheck["英雄视图检查"]
ThirdCheck --> IsValid3{"英雄视图有效?"}
IsValid3 --> |否| GracefulFail["优雅失败"]
IsValid3 --> |是| FinalExecution["最终执行"]
EarlyReturn --> End[方法结束]
SafeExit --> End
GracefulFail --> End
FinalExecution --> End
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L70-L75)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L80-L85)
#### 异常处理策略
| 异常类型 | 检查点 | 处理策略 | 预防措施 |
|---------|--------|----------|----------|
| 节点被销毁 | 每次关键操作前 | 提前返回,避免操作 | 定期检查节点有效性 |
| 英雄视图丢失 | 技能执行前 | 日志记录,跳过执行 | 保持对英雄状态的监控 |
| 定时器失效 | 定时器回调中 | 检查上下文有效性 | 使用闭包保护上下文 |
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L70-L75)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L80-L85)
## 依赖关系分析
### 组件间依赖关系
技能执行资源管理系统涉及多个组件间的复杂依赖关系:
```mermaid
graph TB
subgraph "核心组件"
SkillConComp["SkillConComp<br/>技能控制器"]
SkillEnt["SkillEnt<br/>技能实体"]
HeroViewComp["HeroViewComp<br/>英雄视图"]
end
subgraph "事件系统"
GameEvent["GameEvent<br/>事件枚举"]
MessageSystem["消息系统"]
end
subgraph "资源管理"
TimerModule["定时器模块"]
ComponentPool["组件池"]
end
subgraph "战斗系统"
MissionComp["MissionComp<br/>任务管理"]
BattleManager["战斗管理器"]
end
SkillConComp --> SkillEnt
SkillConComp --> HeroViewComp
SkillConComp --> TimerModule
SkillConComp --> GameEvent
GameEvent --> MessageSystem
MessageSystem --> SkillConComp
MissionComp --> BattleManager
BattleManager --> MessageSystem
SkillConComp -.-> ComponentPool
HeroViewComp -.-> ComponentPool
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L15)
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L20)
### 外部依赖分析
| 依赖类型 | 组件名称 | 作用 | 影响范围 |
|---------|----------|------|----------|
| 框架依赖 | Oops Framework | 定时器管理、消息系统 | 全局功能 |
| 引擎依赖 | Cocos Creator | 节点管理、组件系统 | 渲染层 |
| 配置依赖 | SkillSet | 技能配置数据 | 业务逻辑 |
| 事件依赖 | GameEvent | 事件通信机制 | 系统集成 |
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L15)
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L1-L70)
## 性能考量
### 定时器性能优化
技能系统的定时器管理采用了多项性能优化策略:
#### 定时器池化管理
- **批量清理**:使用`Object.values().forEach()`进行批量定时器清理
- **内存复用**:通过`_timers`对象实现定时器ID的集中管理
- **延迟清理**:在合适的时机(如`onDestroy``FightEnd`事件)进行清理
#### 性能监控指标
| 性能指标 | 目标值 | 监控方法 | 优化策略 |
|---------|--------|----------|----------|
| 定时器数量 | < 100个 | 运行时统计 | 实施清理阈值 |
| 清理耗时 | < 16ms | 时间测量 | 异步清理 |
| 内存占用 | < 10MB | 内存分析 | 对象池化 |
### 内存泄漏防护
系统通过多重防护机制防止内存泄漏:
```mermaid
flowchart LR
subgraph "防护层次"
Level1["第一层:节点检查"]
Level2["第二层:事件解绑"]
Level3["第三层:组件销毁"]
Level4["第四层:框架清理"]
end
Level1 --> Level2
Level2 --> Level3
Level3 --> Level4
subgraph "检测机制"
LeakDetection["泄漏检测"]
MemoryProfiling["内存分析"]
ResourceTracking["资源追踪"]
end
Level4 --> LeakDetection
LeakDetection --> MemoryProfiling
MemoryProfiling --> ResourceTracking
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L177)
## 故障排除指南
### 常见问题诊断
#### 定时器未清理问题
**症状表现**
- 浏览器内存持续增长
- 控制台出现定时器警告
- 技能执行异常延迟
**诊断步骤**
1. 检查`_timers`对象是否正确初始化
2. 验证`onDestroy`方法是否被调用
3. 确认`FightEnd`事件是否正常触发
**解决方案**
```typescript
// 修复方案示例
public onDestroy() {
// 确保清理所有定时器
Object.values(this._timers).forEach(clearTimeout);
this._timers = {};
// 移除事件监听器
this.off(GameEvent.FightEnd);
// 调用父类销毁方法
super.onDestroy();
}
```
#### 节点无效异常
**症状表现**
- 技能执行过程中抛出null引用异常
- 控制台出现"node is not valid"错误
**诊断方法**
- 在关键位置添加节点有效性检查
- 监控节点销毁时机
- 分析组件生命周期
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L70-L75)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L80-L85)
### 调试工具和技巧
#### 定时器状态监控
开发环境下可以通过以下方式监控定时器状态:
| 监控项 | 检查方法 | 正常状态 | 异常状态 |
|-------|----------|----------|----------|
| 定时器数量 | `Object.keys(this._timers).length` | < 10 | > 100 |
| 清理完整性 | `this._timers`对象状态 | `{}` | 包含未清理的定时器ID |
| 事件监听器 | `this.has(GameEvent.FightEnd)` | `false` | `true` |
#### 性能分析工具
推荐使用以下工具进行性能分析:
- Chrome DevTools Memory面板
- Cocos Creator Profiler
- 自定义定时器监控日志
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L150-L177)
## 结论
技能执行资源管理系统通过多层次的定时器管理策略,实现了高效、安全的资源控制。系统的核心优势包括:
### 主要成就
1. **完善的生命周期管理**:通过`onDestroy``reset`方法确保组件销毁时的资源清理
2. **事件驱动的自动清理**:利用`FightEnd`事件实现战斗结束时的自动资源回收
3. **多重安全性检查**:在关键路径实施节点有效性检查,防止异常情况
4. **灵活的清理策略**:支持单个定时器清理和批量清理两种模式
### 最佳实践总结
- **及时清理**:在组件销毁和战斗结束时立即清理定时器
- **安全性优先**:在每次关键操作前进行节点有效性检查
- **事件驱动**:利用事件系统实现自动化资源管理
- **异常处理**:在定时器回调中实施完善的异常处理机制
### 未来改进方向
1. **异步清理优化**:考虑将大量定时器的清理操作异步化
2. **资源使用统计**:增加定时器使用情况的统计和分析功能
3. **自动泄漏检测**:实现定时器泄漏的自动检测和报告机制
4. **性能监控增强**:集成更详细的性能监控和告警系统
通过这套完整的技能执行资源管理策略,系统能够在保证功能完整性的同时,有效防止内存泄漏和资源浪费,为游戏的稳定运行提供坚实保障。

View File

@@ -0,0 +1,474 @@
# 目标选择策略
<cite>
**本文档引用的文件**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts)
- [HeroViewComp.ts](file://assets/script/hero/HeroViewComp.ts)
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
- [Hero.ts](file://assets/script/hero/Hero.ts)
- [Mon.ts](file://assets/script/hero/Mon.ts)
</cite>
## 目录
1. [概述](#概述)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 概述
本文档深入分析了《英雄传说》游戏中目标选择算法的核心实现,重点关注`selectTargets`方法的策略设计。该算法采用智能的目标分配机制,确保战斗系统的公平性和策略性。
目标选择算法的核心特点:
- **优先级策略**:第一个目标总是最前排的单位
- **随机性机制**:后续目标通过随机选择确保多样性
- **重复允许**:支持同一目标被多次选中
- **边界处理**:当无可用目标时返回默认位置
- **阵营感知**基于FacSet判断左右方向
## 项目结构
```mermaid
graph TB
subgraph "技能系统"
SkillConComp["SkillConComp<br/>技能控制器"]
SkillEnt["SkillEnt<br/>技能实体"]
end
subgraph "阵营系统"
FacSet["FacSet<br/>阵营枚举"]
HeroViewComp["HeroViewComp<br/>英雄视图组件"]
end
subgraph "ECS系统"
ECS["ECS框架"]
BattleMoveSystem["BattleMoveSystem<br/>战斗移动系统"]
end
subgraph "目标检测"
check_target["check_target()<br/>目标检测"]
get_front["get_front()<br/>前排检测"]
selectTargets["selectTargets()<br/>目标选择"]
end
SkillConComp --> check_target
SkillConComp --> get_front
SkillConComp --> selectTargets
check_target --> ECS
get_front --> ECS
BattleMoveSystem --> ECS
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L109-L122)
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L165-L200)
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts#L1-L109)
## 核心组件
### SkillConComp - 技能控制器
`SkillConComp`是目标选择算法的核心控制器,负责协调整个目标选择流程。该组件继承自`CCComp`实现了ECS注册功能。
主要职责:
- **技能施放管理**:控制技能的触发时机和目标选择
- **目标选择协调**:调用`selectTargets`方法获取目标坐标
- **异常处理**:确保节点有效性检查和资源清理
### FacSet - 阵营系统
`FacSet`定义了游戏中的阵营概念,是目标选择算法的重要输入参数。
阵营常量:
- `HERO = 0`:英雄阵营,位于战场左侧
- `MON = 1`:怪物阵营,位于战场右侧
阵营决定了目标选择的方向性逻辑,英雄会选择右侧的怪物作为目标,而怪物会选择左侧的英雄作为目标。
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L50)
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts#L48-L50)
## 架构概览
```mermaid
sequenceDiagram
participant SkillCon as "SkillConComp"
participant ECS as "ECS查询系统"
participant BattleMove as "BattleMoveSystem"
participant HeroView as "HeroViewComp"
SkillCon->>SkillCon : check_target()
SkillCon->>ECS : ecs.query(allOf(MonModelComp))
ECS-->>SkillCon : 目标实体列表
alt 有可用目标
SkillCon->>SkillCon : get_front(entities)
SkillCon->>SkillCon : selectTargets(t_num)
SkillCon->>SkillCon : 返回目标坐标数组
else 无可用目标
SkillCon->>SkillCon : 返回默认位置
end
Note over SkillCon,BattleMove : 目标选择完成,准备施放技能
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L109-L154)
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L198-L235)
## 详细组件分析
### selectTargets 方法详解
`selectTargets`方法是目标选择算法的核心实现,采用了精心设计的策略来确保战斗的公平性和策略性。
#### 算法流程
```mermaid
flowchart TD
Start([开始目标选择]) --> CheckEntities["检查可用实体"]
CheckEntities --> HasEntities{"是否有可用实体?"}
HasEntities --> |否| DefaultPos["返回默认位置"]
DefaultPos --> CloneDefault["克隆默认位置"]
CloneDefault --> ReturnDefault["返回t_num个默认位置"]
HasEntities --> |是| GetFront["获取最前排目标"]
GetFront --> PushFront["添加最前排坐标到targets"]
PushFront --> LoopTargets["循环添加后续目标"]
LoopTargets --> RandomSelect["随机选择实体"]
RandomSelect --> AddRandom["添加随机坐标到targets"]
AddRandom --> MoreTargets{"还有更多目标?"}
MoreTargets --> |是| LoopTargets
MoreTargets --> |否| ReturnTargets["返回目标坐标数组"]
ReturnDefault --> End([结束])
ReturnTargets --> End
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L128-L154)
#### 第一个目标:最前排单位
算法的第一个目标总是最前排的单位,这是基于以下设计原则:
1. **战略优先级**:最前排单位通常是敌方的主力或关键目标
2. **视觉反馈**:玩家能够直观看到技能的主要目标
3. **战斗节奏**:确保技能施放具有明确的战略意义
**实现细节**
- 使用`get_front`方法确定最前排位置
- 根据阵营方向选择最小或最大X坐标
- 确保第一个目标始终是最接近施法者的前排单位
#### 后续目标:随机选择机制
从第二个目标开始,算法采用随机选择机制:
1. **随机性保证**:每个目标都有平等的选择机会
2. **重复允许**:同一个实体可能被多次选中
3. **性能优化**:避免复杂的排序和去重操作
**实现原理**
- 使用`Math.random()`生成随机索引
- 直接从实体列表中选择对应实体
- 确保算法复杂度为O(n)其中n为目标数量
#### 默认位置处理
当没有可用目标时,算法返回预定义的默认位置:
```typescript
const defaultPos = this.HeroView.fac === FacSet.HERO ? v3(400, 0, 0) : v3(-400, 0, 0);
```
**设计意图**
- **战场定位**:默认位置位于战场边缘,不影响战斗区域
- **视觉平衡**:确保技能效果在视觉上仍然有意义
- **战术灵活性**:为玩家提供策略选择的空间
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L128-L154)
### check_target 方法分析
`check_target`方法负责根据阵营确定目标实体集合:
```mermaid
classDiagram
class SkillConComp {
+HeroView : any
+check_target() Entity[]
+get_front(entities) Vec3
+selectTargets(t_num) Vec3[]
}
class FacSet {
<<enumeration>>
HERO = 0
MON = 1
}
class ECS {
+query(filter) Entity[]
+allOf(component) Filter
}
SkillConComp --> FacSet : "使用"
SkillConComp --> ECS : "查询"
note for SkillConComp "根据阵营决定查询英雄还是怪物"
note for FacSet "定义阵营常量"
note for ECS "提供实体查询功能"
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L109-L115)
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts#L48-L50)
**实现逻辑**
- 英雄阵营FacSet.HERO查询怪物实体MonModelComp
- 怪物阵营FacSet.MON查询英雄实体HeroModelComp
这种设计确保了目标选择的阵营对立性,符合游戏的战斗机制。
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L109-L115)
### get_front 方法详解
`get_front`方法实现了前排单位的智能识别:
#### X坐标比较逻辑
```mermaid
flowchart LR
subgraph "英雄阵营 (FacSet.HERO)"
MinX["Math.min(...entities.map(e => e.get(HeroViewComp).node.position.x))"]
MinX --> Leftmost["找到最左侧的X坐标"]
end
subgraph "怪物阵营 (FacSet.MON)"
MaxX["Math.max(...entities.map(e => e.get(HeroViewComp).node.position.x))"]
MaxX --> Rightmost["找到最右侧的X坐标"]
end
Leftmost --> KeyEntity["查找对应实体"]
Rightmost --> KeyEntity
KeyEntity --> FrontPos["返回前排坐标"]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L116-L122)
#### 方向性判断
算法根据阵营自动判断左右方向:
1. **英雄阵营**寻找最小X坐标即最左侧的单位
2. **怪物阵营**寻找最大X坐标即最右侧的单位
这种设计符合战场布局的直觉认知,英雄在左侧,怪物在右侧。
#### 实体匹配过程
```typescript
let keyPos = this.HeroView.fac == FacSet.HERO ?
Math.min(...entities.map(e => e.get(HeroViewComp).node.position.x)) :
Math.max(...entities.map(e => e.get(HeroViewComp).node.position.x));
let keyEntity = entities.find(e => e.get(HeroViewComp).node.position.x === keyPos);
return keyEntity.get(HeroViewComp).node.position;
```
这个过程确保了:
- 正确的前排单位被识别
- 坐标信息准确返回
- 异常情况下的稳定性
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L116-L122)
### ECS查询与坐标比较整合
目标选择算法与ECS系统的深度集成体现在以下几个方面
#### 查询优化
```mermaid
graph TD
A[ECS查询] --> B[allOf过滤]
B --> C[实体列表]
C --> D[坐标提取]
D --> E[X坐标数组]
E --> F[Math.min/max计算]
F --> G[前排坐标]
G --> H[实体匹配]
H --> I[最终目标]
style A fill:#e1f5fe
style F fill:#f3e5f5
style I fill:#e8f5e8
```
**图表来源**
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L198-L235)
#### 性能考量
1. **批量查询**:一次性获取所有符合条件的实体
2. **延迟计算**:只在需要时进行坐标比较
3. **内存优化**:避免不必要的对象创建
#### 异常处理
算法包含了多层异常保护:
1. **空实体检查**:防止空列表访问
2. **坐标有效性验证**:确保坐标数据正确
3. **实体状态检查**:排除无效或死亡的实体
**章节来源**
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L198-L235)
## 依赖关系分析
```mermaid
graph LR
subgraph "外部依赖"
ECS["ECS框架"]
Vec3["Vec3类"]
FacSet["FacSet枚举"]
end
subgraph "内部组件"
SkillConComp["SkillConComp"]
HeroViewComp["HeroViewComp"]
BattleMoveSystem["BattleMoveSystem"]
end
subgraph "配置文件"
BoxSet["BoxSet.ts"]
heroSet["heroSet.ts"]
end
SkillConComp --> ECS
SkillConComp --> Vec3
SkillConComp --> FacSet
SkillConComp --> HeroViewComp
BattleMoveSystem --> ECS
BattleMoveSystem --> HeroViewComp
BoxSet --> FacSet
heroSet --> HeroViewComp
style SkillConComp fill:#ffeb3b
style ECS fill:#2196f3
style FacSet fill:#4caf50
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L15)
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts#L1-L10)
### 核心依赖关系
1. **ECS框架依赖**`ecs.query()`用于实体查询
2. **数学运算依赖**`Math.min()``Math.max()`用于坐标比较
3. **类型系统依赖**`Vec3``Entity`类型定义
4. **配置系统依赖**`FacSet`提供阵营常量
### 松耦合设计
算法采用松耦合设计,便于维护和扩展:
- **接口隔离**通过ECS查询接口与具体实体解耦
- **配置驱动**:阵营逻辑通过配置文件管理
- **模块化组织**:各功能模块职责单一
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L1-L270)
## 性能考虑
### 时间复杂度分析
目标选择算法的时间复杂度为O(n)其中n为目标数量
1. **ECS查询**O(m)m为实体总数
2. **坐标提取**O(m)
3. **前排计算**O(m)
4. **目标生成**O(n)
### 空间复杂度分析
空间复杂度为O(m+n),主要用于存储实体列表和目标坐标:
1. **实体缓存**:存储查询结果
2. **目标数组**:存储最终目标坐标
3. **临时变量**:坐标计算过程中的中间值
### 性能优化策略
1. **查询复用**:一次查询结果供多个目标选择使用
2. **延迟计算**:只在需要时进行坐标比较
3. **内存池化**重用Vec3对象减少GC压力
## 故障排除指南
### 常见异常情况
#### 空实体列表
**问题描述**:当没有可用目标时,算法返回默认位置。
**解决方案**
- 检查ECS查询条件是否正确
- 验证实体是否正确添加到场景中
- 确认实体组件是否完整
#### 坐标计算错误
**问题描述**:前排单位识别不准确。
**解决方案**
- 验证`HeroViewComp`组件是否正确挂载
- 检查实体位置是否正确初始化
- 确认坐标系统的一致性
#### 随机选择偏差
**问题描述**:随机选择结果不均匀。
**解决方案**
- 检查`Math.random()`的分布特性
- 验证实体列表的完整性
- 确认索引计算的正确性
### 调试技巧
1. **日志记录**:在关键步骤添加调试信息
2. **可视化**:绘制目标选择路径
3. **单元测试**:为每个方法编写测试用例
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L128-L154)
## 结论
目标选择算法展现了优秀的工程设计原则:
### 设计优势
1. **清晰的职责分离**:每个方法专注于特定功能
2. **灵活的扩展性**:易于适应新的需求变化
3. **稳定的性能表现**O(n)时间复杂度确保高效运行
4. **健壮的异常处理**:多层次保护机制
### 战术价值
算法的设计充分考虑了战斗策略的需求:
- **优先级策略**:确保关键目标优先被选中
- **随机性机制**:增加战斗的不确定性和趣味性
- **边界处理**:优雅处理异常情况
- **阵营感知**:符合游戏世界的逻辑设定
### 未来改进方向
1. **智能预测**:基于历史数据预测目标偏好
2. **动态权重**:根据战斗状态调整目标选择权重
3. **机器学习**利用AI技术优化目标选择策略
4. **实时反馈**:提供更直观的目标选择反馈
该算法为游戏战斗系统提供了坚实的基础,其设计理念和实现方式值得在类似项目中借鉴和应用。

View File

@@ -0,0 +1,769 @@
# 技能系统
<cite>
**本文档中引用的文件**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts)
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts)
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
- [Tooltip.ts](file://assets/script/game/skill/Tooltip.ts)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [技能配置系统](#技能配置系统)
7. [技能控制机制](#技能控制机制)
8. [技能释放流程](#技能释放流程)
9. [异常处理与最佳实践](#异常处理与最佳实践)
10. [性能考虑](#性能考虑)
11. [故障排除指南](#故障排除指南)
12. [总结](#总结)
## 简介
技能系统是游戏战斗的核心机制负责管理角色的技能释放、冷却时间、目标选择、特效播放等关键功能。本系统采用ECS架构设计通过模块化的方式实现了技能的完整生命周期管理包括技能配置、控制、执行和特效展示。
## 项目结构
技能系统的文件组织遵循模块化原则,主要分为以下几个部分:
```mermaid
graph TB
subgraph "配置层"
A[SkillSet.ts<br/>技能配置表]
end
subgraph "控制层"
B[SkillConComp.ts<br/>技能控制组件]
end
subgraph "执行层"
C[SkillEnt.ts<br/>技能实体]
D[SkillViewCom.ts<br/>技能视图组件]
E[AtkConCom.ts<br/>攻击控制组件]
end
subgraph "支持层"
F[HeroViewComp.ts<br/>英雄视图组件]
G[Tooltip.ts<br/>提示系统]
end
A --> B
B --> C
C --> D
D --> E
B --> F
E --> G
```
**图表来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L1-L148)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
**章节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L1-L148)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
## 核心组件
技能系统由以下核心组件构成:
### 技能配置表 (SkillSet)
负责定义技能的所有属性和行为规则,包括技能类型、目标群体、伤害类型、冷却时间等关键字段。
### 技能控制组件 (SkillConComp)
管理技能的触发逻辑、冷却时间计算、目标选择和定时器资源管理。
### 技能实体 (SkillEnt)
负责技能的实例化、特效加载和生命周期管理。
### 技能视图组件 (SkillViewCom)
处理技能的视觉表现、动画播放和位置计算。
### 攻击控制组件 (AtkConCom)
实现具体的攻击逻辑、碰撞检测和伤害计算。
**章节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L1-L148)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
## 架构概览
技能系统采用分层架构设计,确保各组件职责清晰、耦合度低:
```mermaid
graph TD
subgraph "表现层"
A[技能视图组件<br/>SkillViewCom]
B[特效播放<br/>Animation/Particle]
end
subgraph "控制层"
C[技能控制组件<br/>SkillConComp]
D[攻击控制组件<br/>AtkConCom]
end
subgraph "数据层"
E[技能实体<br/>SkillEnt]
F[技能配置<br/>SkillSet]
end
subgraph "业务层"
G[英雄视图组件<br/>HeroViewComp]
H[目标选择<br/>selectTargets]
end
A --> C
C --> E
E --> F
C --> G
D --> A
G --> H
B --> D
```
**图表来源**
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L1-L156)
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L1-L236)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
## 详细组件分析
### 技能配置系统 (SkillSet)
技能配置系统是整个技能体系的基础,定义了技能的所有属性和行为规则。
#### 技能类型枚举 (SType)
| 类型 | 值 | 描述 | 用途 |
|------|----|----- |----- |
| damage | 0 | 伤害技能 | 对目标造成物理/魔法伤害 |
| heal | 1 | 治疗技能 | 恢复目标生命值 |
| shield | 2 | 护盾技能 | 为目标添加护盾 |
| atk_speed | 3 | 攻击速度提升 | 提升攻击速度 |
| power_up | 4 | 力量提升 | 提升攻击力 |
| ap_up | 5 | 法术强度提升 | 提升法术伤害 |
| dod_up | 6 | 闪避提升 | 提升闪避率 |
| crit_up | 7 | 暴击率提升 | 提升暴击率 |
| crit_dmg_up | 8 | 暴击伤害提升 | 提升暴击伤害 |
| wfuny_up | 9 | 连击率提升 | 提升连击触发概率 |
| zhaohuan | 10 | 召唤技能 | 召唤生物协助战斗 |
| buff | 11 | 增益技能 | 为目标添加增益效果 |
#### 目标群体枚举 (TGroup)
| 群体 | 值 | 描述 | 适用场景 |
|------|----|----- |---------|
| Self | 0 | 自身 | 自身增益、治疗技能 |
| Ally | 1 | 所有敌人 | 团队治疗、辅助技能 |
| Team | 2 | 所有友方 | 团队增益、保护技能 |
| Enemy | 3 | 敌方单位 | 输出技能、控制技能 |
| All | 4 | 所有单位 | 全局效果、范围伤害 |
#### 伤害类型枚举 (DTType)
| 类型 | 值 | 描述 | 特点 |
|------|----|----- |------|
| single | 0 | 单体伤害 | 针对单一目标 |
| range | 1 | 范围伤害 | 对多个目标造成伤害 |
#### 关键字段说明
```mermaid
classDiagram
class SkillConfig {
+number uuid
+string name
+string sp_name
+AtkedName AtkedName
+string path
+TGroup TGroup
+SType SType
+string act
+DTType DTType
+DType DType
+number ap
+number cd
+number t_num
+number hit_num
+number hit
+number hitcd
+number speed
+number cost
+number with
+BuffConf[] buffs
+NeAttrsConf[] neAttrs
+string info
+number hero
}
class BuffConf {
+Attrs buff
+BType BType
+number value
+number time
+number chance
}
class NeAttrsConf {
+NeAttrs neAttrs
+number value
+number time
}
SkillConfig --> BuffConf : "包含"
SkillConfig --> NeAttrsConf : "包含"
```
**图表来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L118-L148)
**章节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L1-L148)
### 技能控制组件 (SkillConComp)
技能控制组件负责技能的整体管理和触发逻辑,是技能系统的核心控制器。
#### 主要功能
1. **冷却时间管理**
- 监控技能冷却进度
- 自动重置冷却时间
- 处理技能消耗检查
2. **自动施法条件判断**
- 检查角色状态(眩晕、冰冻等)
- 验证魔法值充足
- 判断攻击状态冲突
3. **多段技能连发机制**
- 实现wfuny连击系统
- 控制技能释放间隔
- 管理连击计数器
4. **目标选择策略**
- 基于阵营的目标查询
- 前排/后排目标优先级
- 随机目标选择算法
#### 核心方法分析
```mermaid
sequenceDiagram
participant Player as 玩家输入
participant SkillCon as 技能控制组件
participant HeroView as 英雄视图
participant SkillEnt as 技能实体
participant AtkCon as 攻击控制
Player->>SkillCon : 更新技能冷却
SkillCon->>SkillCon : 检查冷却时间
SkillCon->>HeroView : 检查角色状态
HeroView-->>SkillCon : 状态验证结果
SkillCon->>SkillCon : 选择目标
SkillCon->>HeroView : 播放技能特效
SkillCon->>SkillEnt : 创建技能实体
SkillEnt->>AtkCon : 初始化攻击组件
AtkCon->>AtkCon : 执行攻击逻辑
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L35-L177)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L78)
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
### 技能实体 (SkillEnt)
技能实体负责技能的实例化和生命周期管理,确保技能能够正确地在游戏中表现。
#### 实体创建流程
```mermaid
flowchart TD
A[技能触发] --> B[加载技能配置]
B --> C{配置是否存在?}
C --> |否| D[输出错误日志]
C --> |是| E[检查施法者]
E --> F{施法者是否存在?}
F --> |否| D
F --> |是| G[加载特效预制体]
G --> H{预制体加载成功?}
H --> |否| D
H --> |是| I[实例化特效节点]
I --> J[设置节点属性]
J --> K[添加技能组件]
K --> L[技能实体就绪]
D --> M[结束]
L --> N[等待执行时机]
N --> O[执行技能逻辑]
```
**图表来源**
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L78)
**章节来源**
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
### 技能视图组件 (SkillViewCom)
技能视图组件处理技能的视觉表现和动画播放,是技能外观效果的主要控制者。
#### 动画类型支持
| 类型 | 值 | 描述 | 实现方式 |
|------|----|----- |---------|
| linear | 0 | 直线运动 | 线性插值移动 |
| bezier | 1 | 贝塞尔曲线 | 贝塞尔曲线轨迹 |
| fixed | 2 | 固定起点 | 起点固定,终点动态 |
| fixedEnd | 3 | 固定终点 | 终点固定,起点动态 |
**章节来源**
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L1-L156)
### 攻击控制组件 (AtkConCom)
攻击控制组件实现具体的攻击逻辑,包括碰撞检测、伤害计算和效果应用。
#### 碰撞检测机制
```mermaid
flowchart TD
A[技能移动] --> B[检测碰撞]
B --> C{是否接触敌方}
C --> |否| D[继续移动]
C --> |是| E[检查穿透次数]
E --> F{达到最大穿透?}
F --> |是| G[销毁技能]
F --> |否| H[计算伤害]
H --> I[应用伤害效果]
I --> J[增加穿透计数]
J --> K{范围伤害?}
K --> |是| L[对范围内所有目标]
K --> |否| M[仅对当前目标]
L --> N[继续移动]
M --> N
D --> N
G --> O[结束]
```
**图表来源**
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L120-L180)
**章节来源**
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L1-L236)
## 技能配置系统
技能配置系统是技能系统的基础通过SkillSet.ts定义了所有技能的属性和行为规则。
### 配置表结构
技能配置表采用Record结构以技能UUID作为键SkillConfig接口作为值
```typescript
export const SkillSet: Record<number, SkillConfig> = {
6001: {
uuid: 6001,
name: "挥击",
sp_name: "atk_s1",
AtkedName: AtkedName.atked,
path: "3036",
TGroup: TGroup.Enemy,
SType: SType.damage,
act: "atk",
DTType: DTType.single,
DType: DType.ATK,
ap: 100,
cd: 1,
t_num: 1,
hit_num: 1,
hit: 1,
hitcd: 0.2,
speed: 720,
cost: 0,
with: 0,
buffs: [],
neAttrs: [],
info: "向最前方敌人扔出石斧,造成100%攻击的伤害"
},
// 更多技能配置...
}
```
### 关键配置字段详解
| 字段 | 类型 | 描述 | 默认值 | 说明 |
|------|------|------|--------|------|
| uuid | number | 技能唯一标识符 | - | 必需,用于技能识别 |
| name | string | 技能名称 | - | 显示用名称 |
| sp_name | string | 特效名称 | - | 对应特效资源文件名 |
| TGroup | TGroup | 目标群体 | - | 技能作用目标类型 |
| SType | SType | 技能类型 | - | 技能效果类型 |
| cd | number | 冷却时间 | - | 技能冷却秒数 |
| cost | number | 消耗值 | - | 魔法值或能量消耗 |
| ap | number | 伤害倍率 | - | 伤害相对于攻击力的百分比 |
| hit | number | 穿透次数 | 0 | 攻击可穿透的目标数量 |
| hitcd | number | 持续伤害间隔 | 0 | 持续伤害的触发间隔 |
**章节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L118-L148)
## 技能控制机制
技能控制机制是技能系统的核心,负责技能的触发、冷却管理和执行逻辑。
### 冷却时间管理系统
冷却时间管理采用增量式计算,每帧更新技能的冷却进度:
```mermaid
flowchart TD
A[技能冷却开始] --> B[dt累积]
B --> C[检查冷却时间]
C --> D{是否达到冷却?}
D --> |否| E[继续累积]
D --> |是| F[检查魔法值]
F --> G{魔法值充足?}
G --> |否| H[等待补充]
G --> |是| I[触发技能]
E --> B
H --> F
I --> J[重置冷却时间]
J --> K[扣除魔法值]
K --> L[技能准备就绪]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L35-L50)
### 自动施法条件判断
系统在每次更新时检查多个条件:
1. **战斗状态检查**
- 检查mission.play状态
- 验证mission.pause状态
2. **角色状态检查**
- 检查眩晕状态 (isStun())
- 检查冰冻状态 (isFrost())
3. **技能状态检查**
- 验证冷却时间是否完成
- 检查魔法值是否足够
- 确认攻击状态不冲突
### 多段技能连发机制
系统支持wfuny连击机制通过check_wfuny方法判断是否触发连击
```mermaid
sequenceDiagram
participant SkillCon as 技能控制
participant HeroView as 英雄视图
participant Timer as 定时器系统
SkillCon->>HeroView : 检查wfuny属性
HeroView-->>SkillCon : 返回连击概率
SkillCon->>SkillCon : 随机数生成
alt 触发连击
SkillCon->>Timer : 设置延迟执行
Timer->>SkillCon : 延迟后再次执行
SkillCon->>SkillCon : 递归调用doSkill
else 未触发连击
SkillCon->>SkillCon : 正常结束
end
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L85-L105)
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L35-L177)
## 技能释放流程
技能释放是一个复杂的多阶段过程,涉及预判、特效播放、实体生成等多个环节。
### 技能释放全过程
```mermaid
sequenceDiagram
participant Player as 玩家操作
participant SkillCon as 技能控制
participant HeroView as 英雄视图
participant SkillEnt as 技能实体
participant AtkCon as 攻击控制
participant Target as 目标对象
Player->>SkillCon : 发起技能请求
SkillCon->>SkillCon : 验证技能可用性
SkillCon->>HeroView : 播放技能动画
HeroView-->>SkillCon : 动画播放完成
SkillCon->>SkillCon : 创建技能实体
SkillCon->>SkillEnt : 加载技能配置
SkillEnt->>SkillEnt : 实例化特效节点
SkillEnt->>AtkCon : 添加攻击组件
AtkCon->>AtkCon : 初始化技能参数
AtkCon->>Target : 开始攻击逻辑
Target-->>AtkCon : 碰撞检测结果
AtkCon->>AtkCon : 计算伤害效果
AtkCon->>Target : 应用伤害效果
AtkCon->>AtkCon : 检查技能结束条件
alt 技能需要多段
AtkCon->>AtkCon : 继续下一段攻击
else 技能结束
AtkCon->>AtkCon : 销毁技能实体
end
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L60-L105)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L78)
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L120-L180)
### 目标选择策略
目标选择是技能系统的重要组成部分,采用智能算法确定技能目标:
```mermaid
flowchart TD
A[开始目标选择] --> B[查询目标实体]
B --> C{是否有目标?}
C --> |否| D[返回默认位置]
C --> |是| E[确定前排目标]
E --> F[添加前排目标到列表]
F --> G{还需要更多目标?}
G --> |否| H[返回目标列表]
G --> |是| I[随机选择剩余目标]
I --> J[添加到目标列表]
J --> K{达到目标数量?}
K --> |否| G
K --> |是| H
D --> L[填充默认位置]
L --> H
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L120-L175)
### 定时器资源管理
系统使用定时器管理技能的延迟执行,确保技能释放的精确控制:
| 定时器类型 | 用途 | 生命周期 | 清理方式 |
|------------|------|----------|----------|
| 技能延迟定时器 | 技能特效延迟播放 | 技能生命周期内 | 技能结束后清理 |
| 连击延迟定时器 | 多段技能间隔 | 连击期间 | 连击结束时清理 |
| 冷却定时器 | 技能冷却倒计时 | 技能冷却期间 | 冷却完成时清理 |
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L60-L177)
## 异常处理与最佳实践
技能系统在设计时充分考虑了各种异常情况,提供了完善的错误处理机制。
### 节点有效性检查
系统在关键操作前进行节点有效性检查,防止因节点被销毁导致的异常:
```typescript
private doSkill(config: typeof SkillSet[keyof typeof SkillSet], is_wfuny: boolean = false, dmg: number = 0) {
// 添加节点有效性检查
if (!this.node || !this.node.isValid || !this.HeroView || !this.HeroView.node || !this.HeroView.node.isValid) {
return;
}
// 技能执行逻辑
// 再次检查节点有效性
if (!this.node || !this.node.isValid || !this.HeroView || !this.HeroView.node || !this.HeroView.node.isValid) {
return;
}
}
```
### 异常处理策略
1. **技能配置缺失处理**
```typescript
load(startPos: Vec3, parent: Node, uuid: number, targetPos: any[], caster: HeroViewComp = null, dmg: number = 0) {
const config = SkillSet[uuid];
if (!config) {
console.error("[Skill] 技能配置不存在:", uuid);
return;
}
}
```
2. **资源加载失败处理**
```typescript
const prefab: Prefab = oops.res.get(path, Prefab);
if (!prefab) {
console.error("[Skill] 预制体加载失败:", path);
return;
}
```
3. **战斗状态异常处理**
```typescript
update(dt: number) {
if (!smc.mission.play || smc.mission.pause) return;
// 技能逻辑执行
}
```
### 最佳实践建议
1. **资源管理**
- 及时清理定时器资源
- 正确释放技能实体
- 避免内存泄漏
2. **性能优化**
- 使用对象池管理技能实体
- 减少不必要的对象创建
- 优化碰撞检测频率
3. **错误恢复**
- 提供默认行为处理异常
- 记录详细的错误日志
- 实现优雅降级机制
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L66-L105)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L40)
## 性能考虑
技能系统在设计时充分考虑了性能优化,采用了多种策略确保流畅的游戏体验。
### 对象池管理
技能实体采用对象池模式,避免频繁的对象创建和销毁:
```typescript
// 在SkillConComp中维护定时器映射
private _timers: { [key: string]: any } = {};
// 定时器资源管理
public clear_timer() {
Object.values(this._timers).forEach(clearTimeout);
}
onDestroy() {
// 清理所有定时器
Object.values(this._timers).forEach(clearTimeout);
this._timers = {};
}
```
### 内存优化策略
1. **延迟加载**
- 技能特效按需加载
- 避免一次性加载所有技能资源
2. **引用管理**
- 使用浅拷贝传递技能属性
- 避免深层复制造成的性能开销
3. **生命周期管理**
- 及时销毁不需要的技能实体
- 清理事件监听器和定时器
### 碰撞检测优化
攻击控制组件采用高效的碰撞检测算法:
```typescript
// 范围伤害优化
public atk(args: any) {
let targetsInRange: HeroViewComp[] = [];
// 使用ECS查询优化目标查找
ecs.query(ecs.allOf(HeroViewComp)).some(e => {
const view = e.get(HeroViewComp);
if (view.fac != this.fac) {
const distance = Math.abs(this.node.position.x - view.node.position.x);
if (distance <= dis) {
targetsInRange.push(view);
}
}
});
}
```
## 故障排除指南
### 常见问题及解决方案
#### 技能无法触发
**症状**: 技能按下后没有反应
**可能原因**:
1. 冷却时间未完成
2. 魔法值不足
3. 角色处于异常状态
4. 技能配置缺失
**解决步骤**:
1. 检查技能冷却时间
2. 验证角色魔法值
3. 确认角色状态正常
4. 检查SkillSet配置
#### 特效播放异常
**症状**: 技能释放但没有特效
**可能原因**:
1. 特效资源加载失败
2. 节点被提前销毁
3. 动画组件配置错误
**解决步骤**:
1. 检查资源路径和文件名
2. 验证节点有效性
3. 确认动画组件正确绑定
#### 目标选择错误
**症状**: 技能攻击了错误的目标
**可能原因**:
1. 目标查询逻辑错误
2. 阵营判断失误
3. 前排/后排判定错误
**解决步骤**:
1. 检查阵营判断逻辑
2. 验证目标位置计算
3. 确认优先级设置
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L170-L177)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L25-L40)
## 总结
技能系统是一个复杂而精密的战斗机制,通过合理的架构设计和完善的异常处理,实现了高效、稳定的技能管理功能。
### 系统优势
1. **模块化设计**: 各组件职责清晰,易于维护和扩展
2. **性能优化**: 采用对象池和延迟加载策略,确保流畅运行
3. **异常处理**: 完善的错误检查和恢复机制
4. **灵活性**: 支持多种技能类型和效果组合
### 技术特点
1. **ECS架构**: 基于组件式设计,提高代码复用性
2. **事件驱动**: 通过事件系统实现组件间的松耦合通信
3. **配置驱动**: 技能行为完全由配置文件控制
4. **资源管理**: 完善的资源加载和释放机制
### 扩展建议
1. **技能树系统**: 可以在此基础上扩展技能升级和解锁机制
2. **连携技能**: 支持多个角色协同释放的组合技能
3. **动态平衡**: 根据玩家表现动态调整技能效果
4. **AI适配**: 为AI敌人提供专门的技能释放策略
技能系统作为游戏战斗的核心,其设计理念和实现方式为类似项目的开发提供了宝贵的参考价值。

View File

@@ -0,0 +1,524 @@
# 技能配置表结构
<cite>
**本文档中引用的文件**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构概览](#项目结构概览)
3. [核心接口定义](#核心接口定义)
4. [枚举类型详解](#枚举类型详解)
5. [技能配置实例分析](#技能配置实例分析)
6. [技能系统架构](#技能系统架构)
7. [战斗系统集成](#战斗系统集成)
8. [新增技能配置流程](#新增技能配置流程)
9. [验证方法与最佳实践](#验证方法与最佳实践)
10. [总结](#总结)
## 简介
SkillSet.ts是游戏技能系统的核心配置文件定义了完整的技能配置表结构和相关的枚举类型。该系统采用ECS架构模式支持多种技能类型、目标群体、伤害类型和效果配置为游戏战斗系统提供了灵活而强大的技能管理框架。
## 项目结构概览
技能系统在项目中的组织结构如下:
```mermaid
graph TB
subgraph "配置层"
SkillSet["SkillSet.ts<br/>技能配置表"]
HeroAttrs["HeroAttrs.ts<br/>属性系统"]
end
subgraph "技能实体层"
SkillEnt["SkillEnt.ts<br/>技能实体"]
SkillViewCom["SkillViewCom.ts<br/>技能视图组件"]
end
subgraph "控制层"
SkillConComp["SkillConComp.ts<br/>技能控制器"]
AtkConCom["AtkConCom.ts<br/>攻击控制器"]
end
subgraph "战斗层"
HeroViewComp["HeroViewComp.ts<br/>英雄视图组件"]
BuffComp["BuffComp.ts<br/>Buff组件"]
end
SkillSet --> SkillEnt
SkillEnt --> SkillViewCom
SkillConComp --> SkillEnt
AtkConCom --> SkillEnt
HeroViewComp --> BuffComp
SkillSet --> HeroViewComp
```
**图表来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L1-L148)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
## 核心接口定义
### SkillConfig接口结构
SkillConfig是技能配置的核心接口包含了技能的所有属性定义
```mermaid
classDiagram
class SkillConfig {
+number uuid
+string name
+string sp_name
+AtkedName AtkedName
+string path
+TGroup TGroup
+SType SType
+string act
+DTType DTType
+DType DType
+number ap
+number cd
+number t_num
+number hit_num
+number hit
+number hitcd
+number speed
+number cost
+number with
+BuffConf[] buffs
+NeAttrsConf[] neAttrs
+string info
+number hero
}
class BuffConf {
+Attrs buff
+BType BType
+number value
+number time
+number chance
}
class NeAttrsConf {
+NeAttrs neAttrs
+number value
+number time
}
SkillConfig --> BuffConf : "包含多个"
SkillConfig --> NeAttrsConf : "包含多个"
```
**图表来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L127-L148)
### 字段详细说明
| 字段名 | 类型 | 描述 | 默认值 |
|--------|------|------|--------|
| uuid | number | 技能唯一标识符 | - |
| name | string | 技能显示名称 | - |
| sp_name | string | 特效资源名称 | - |
| AtkedName | AtkedName | 受伤动画类型 | - |
| 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 | 技能描述信息 | - |
| hero | number | 关联英雄ID | - |
**章节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L127-L148)
## 枚举类型详解
### TGroup - 目标群体枚举
目标群体决定了技能的作用范围和目标选择策略:
```mermaid
graph LR
TGroup --> Self["Self<br/>自身"]
TGroup --> Ally["Ally<br/>所有友方"]
TGroup --> Team["Team<br/>所有友方"]
TGroup --> Enemy["Enemy<br/>敌方单位"]
TGroup --> All["All<br/>所有单位"]
Self --> SelfDesc["对自己生效<br/>如:治疗技能"]
Ally --> AllyDesc["对所有友方单位<br/>如:增益技能"]
Team --> TeamDesc["同Ally历史遗留"]
Enemy --> EnemyDesc["对敌方单位<br/>如:攻击技能"]
All --> AllDesc["对所有单位<br/>如:全地图技能"]
```
**图表来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L2-L7)
### SType - 技能类型枚举
技能类型定义了技能的主要效果分类:
```mermaid
graph TB
SType --> Damage["damage<br/>伤害型"]
SType --> Heal["heal<br/>治疗型"]
SType --> Shield["shield<br/>护盾型"]
SType --> AtkSpeed["atk_speed<br/>攻速型"]
SType --> PowerUp["power_up<br/>力量型"]
SType --> ApUp["ap_up<br/>攻击型"]
SType --> DodUp["dod_up<br/>闪避型"]
SType --> CritUp["crit_up<br/>暴击型"]
SType --> CritDmgUp["crit_dmg_up<br/>暴击伤害型"]
SType --> WfunyUp["wfuny_up<br/>风怒型"]
SType --> Zhaohuan["zhaohuan<br/>召唤型"]
SType --> Buff["buff<br/>增益型"]
Damage --> DamageDesc["造成物理/魔法伤害"]
Heal --> HealDesc["恢复生命值"]
Shield --> ShieldDesc["生成护盾保护"]
AtkSpeed --> AtkSpeedDesc["提升攻击速度"]
PowerUp --> PowerUpDesc["提升基础属性"]
ApUp --> ApUpDesc["提升攻击力"]
DodUp --> DodUpDesc["提升闪避率"]
CritUp --> CritUpDesc["提升暴击率"]
CritDmgUp --> CritDmgUpDesc["提升暴击伤害"]
WfunyUp --> WfunyUpDesc["提升风怒效果"]
Zhaohuan --> ZhaohuanDesc["召唤单位"]
Buff --> BuffDesc["提供各种增益效果"]
```
**图表来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L34-L43)
### DType - 伤害类型枚举
伤害类型决定了技能的属性分类:
| 枚举值 | 数值 | 描述 | 应用场景 |
|--------|------|------|----------|
| ATK | 0 | 物理伤害 | 物理攻击技能 |
| MAGE | 1 | 魔法伤害 | 法术攻击技能 |
### AtkedName - 受伤动画枚举
定义了不同类型的受伤动画效果:
| 枚举值 | 动画名称 | 效果描述 |
|--------|----------|----------|
| atked | atked | 普通受伤动画 |
| ice | atked_ice | 冰冻受伤动画 |
| fire | atked_fire | 火焰受伤动画 |
| wind | atked_wind | 风元素受伤动画 |
| crit | atked_crit | 暴击受伤动画 |
**章节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L45-L52)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L106-L110)
## 技能配置实例分析
### 代码示例6001 - 挥击
挥击是最基础的物理攻击技能,展示了技能配置的基本要素:
**配置特点:**
- **目标群体**: Enemy敌方单位
- **技能类型**: damage伤害型
- **伤害属性**: ATK物理伤害
- **攻击力百分比**: 100%
- **冷却时间**: 1秒
- **资源消耗**: 0
- **特效名称**: atk_s1
**应用场景**
- 单体物理攻击
- 最基础的普攻技能
- 无附加效果
### 代码示例6005 - 火球术
火球术是一个典型的魔法攻击技能,具有更复杂的配置:
**配置特点:**
- **目标群体**: Enemy敌方单位
- **技能类型**: damage伤害型
- **伤害属性**: MAGE魔法伤害
- **攻击力百分比**: 100%
- **冷却时间**: 5秒
- **资源消耗**: 20
- **特效名称**: atk_fires
- **特殊效果**: 有一定几率施加灼烧状态
**应用场景**
- 单体魔法攻击
- 高资源消耗的强力技能
- 具有附加状态效果
**章节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L130-L148)
## 技能系统架构
### 系统架构图
```mermaid
sequenceDiagram
participant Player as 玩家输入
participant SkillCon as 技能控制器
participant SkillEnt as 技能实体
participant SkillView as 技能视图
participant HeroView as 英雄视图
participant BuffSys as Buff系统
Player->>SkillCon : 发起技能请求
SkillCon->>SkillCon : 检查冷却时间
SkillCon->>SkillCon : 验证资源消耗
SkillCon->>SkillEnt : 创建技能实体
SkillEnt->>SkillView : 加载特效资源
SkillView->>HeroView : 播放技能动画
HeroView->>HeroView : 计算伤害效果
HeroView->>BuffSys : 应用附加效果
BuffSys-->>HeroView : 更新属性状态
HeroView-->>Player : 显示技能效果
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L40-L80)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L70)
### 技能执行流程
```mermaid
flowchart TD
Start([技能请求开始]) --> CheckCD["检查冷却时间"]
CheckCD --> CDReady{"冷却完成?"}
CDReady --> |否| WaitCD["等待冷却"]
CDReady --> |是| CheckCost["检查资源消耗"]
CheckCost --> CostOK{"资源充足?"}
CostOK --> |否| NotEnough["资源不足"]
CostOK --> |是| SelectTarget["选择目标"]
SelectTarget --> LoadEffect["加载特效"]
LoadEffect --> PlayAnim["播放动画"]
PlayAnim --> CalcDamage["计算伤害"]
CalcDamage --> ApplyEffects["应用附加效果"]
ApplyEffects --> UpdateStatus["更新状态"]
UpdateStatus --> End([技能执行完成])
WaitCD --> CheckCD
NotEnough --> End
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L45-L85)
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L147-L186)
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
## 战斗系统集成
### Buff系统集成
技能系统与Buff系统紧密集成支持复杂的附加效果
```mermaid
classDiagram
class HeroViewComp {
+Record~number,BuffInfo[]~ BUFFS
+Record~number,BuffInfo[]~ BUFFS_TEMP
+addBuff(buffConf : BuffConf)
+removeBuff(attrIndex : number, value : number, isPermanent : boolean)
+recalculateSingleAttr(attrIndex : number)
}
class BuffConf {
+Attrs buff
+BType BType
+number value
+number time
+number chance
}
class SkillConfig {
+BuffConf[] buffs
+NeAttrsConf[] neAttrs
}
HeroViewComp --> BuffConf : "管理"
SkillConfig --> BuffConf : "定义"
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L20-L84)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L112-L126)
### 属性计算机制
技能系统支持基于属性的动态计算:
| 属性类型 | 计算方式 | 示例 |
|----------|----------|------|
| 数值型属性 | 基础值 + 所有数值型buff之和 | HP = 100 + 20 + 15 = 135 |
| 百分比型属性 | 基础值 × (1 + 所有百分比buff之和/100) | AP = 50 × (1 + 0.2) = 60 |
| 混合型属性 | (基础值 + 数值型总和) × (1 + 百分比总和/100) | DEF = (100 + 10) × (1 + 0.1) = 121 |
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L217-L251)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L150-L199)
## 新增技能配置流程
### 完整配置步骤
1. **确定技能UUID**
- 确保UUID唯一性
- 按功能分类分配范围如6001-6099为基础攻击
2. **定义基础属性**
```typescript
// 示例配置模板
const newSkill: SkillConfig = {
uuid: 6006,
name: "新技能名称",
sp_name: "特效名称",
AtkedName: AtkedName.atked,
path: "图片资源路径",
TGroup: TGroup.Enemy,
SType: SType.damage,
act: "技能动画名称",
DTType: DTType.single,
DType: DType.ATK,
ap: 150,
cd: 3,
t_num: 1,
hit_num: 1,
hit: 1,
hitcd: 0.2,
speed: 720,
cost: 15,
with: 0,
buffs: [],
neAttrs: [],
info: "技能描述信息",
hero: 1001
};
```
3. **配置目标群体**
- 根据技能效果选择合适的TGroup
- 考虑团队协作和平衡性
4. **设置技能类型**
- 选择最符合技能效果的SType
- 注意与其他技能的差异化
5. **定义数值参数**
- 攻击力百分比(ap)通常在50-200%之间
- 冷却时间(cd):根据技能强度调整
- 资源消耗(cost):平衡技能使用频率
6. **配置附加效果**
- 添加BuffConf数组定义增益效果
- 添加NeAttrsConf数组定义负面效果
- 注意效果的平衡性和独特性
7. **编写技能描述**
- 清晰描述技能效果
- 包含关键数值信息
- 说明使用策略
### 验证检查清单
| 检查项 | 验证内容 | 通过标准 |
|--------|----------|----------|
| UUID唯一性 | 确保uuid不重复 | 不与其他技能冲突 |
| 参数合理性 | 数值在合理范围内 | 符合游戏平衡 |
| 效果一致性 | 描述与实际效果一致 | 文字描述准确 |
| 性能影响 | 对游戏性能影响最小 | 无明显卡顿 |
| 资源完整性 | 所有资源文件存在 | 无缺失资源 |
## 验证方法与最佳实践
### 开发阶段验证
1. **编译时验证**
- TypeScript类型检查确保字段完整
- 枚举值范围验证
- 必填字段检查
2. **运行时验证**
```typescript
// 验证函数示例
function validateSkillConfig(config: SkillConfig): boolean {
// 检查必填字段
if (!config.uuid || !config.name || !config.sp_name) return false;
// 检查数值范围
if (config.ap <= 0 || config.cd <= 0) return false;
// 检查目标群体有效性
if (config.TGroup < 0 || config.TGroup > 4) return false;
return true;
}
```
3. **单元测试**
- 测试各种技能类型的执行
- 验证Buff效果的正确应用
- 检查目标选择逻辑
### 平衡性测试
1. **强度评估**
- 与其他同类技能对比
- 在不同场景下的表现
- 对游戏整体平衡的影响
2. **使用频率测试**
- 冷却时间对玩家体验的影响
- 资源消耗的合理性
- 技能组合的可行性
3. **视觉效果验证**
- 特效资源的质量
- 动画流畅度
- 视觉反馈的清晰度
### 性能优化建议
1. **资源管理**
- 合理控制特效资源大小
- 使用对象池减少内存分配
- 及时释放不再使用的资源
2. **算法优化**
- 优化目标选择算法
- 减少不必要的计算
- 使用空间换时间的策略
3. **网络同步**
- 确保技能效果在网络环境下的同步
- 处理延迟和丢包情况
- 保证客户端和服务端的一致性
## 总结
SkillSet.ts定义了一个完整而灵活的技能配置系统通过精心设计的接口和枚举类型为游戏战斗系统提供了强大的技能管理能力。该系统的主要优势包括
1. **结构化配置**通过SkillConfig接口实现了技能属性的标准化管理
2. **灵活扩展**:枚举类型和接口设计支持未来功能扩展
3. **类型安全**TypeScript类型系统确保配置的正确性
4. **性能优化**ECS架构和组件化设计提高了系统效率
5. **易于维护**:清晰的代码结构和完善的注释便于维护
通过遵循本文档提供的配置流程和最佳实践,开发者可以快速创建高质量的游戏技能,并确保其在游戏系统中的稳定运行。技能系统的持续优化和完善将为玩家带来更加丰富和有趣的游戏体验。

View File

@@ -0,0 +1,501 @@
# 英雄属性系统
<cite>
**本文档中引用的文件**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
- [Hero.ts](file://assets/script/game/hero/Hero.ts)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts)
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
英雄属性系统是游戏《heroes》的核心战斗机制之一负责管理英雄的基础属性、成长属性、动态计算以及战斗中的实时更新。该系统采用模块化设计通过HeroAttrs.ts定义属性枚举和配置Hero.ts实现英雄实体管理HeroViewComp.ts处理属性计算和UI更新形成了完整的属性管理体系。
系统支持多种属性类型包括基础生存属性、攻击属性、防御属性、特殊效果属性等每种属性都有明确的数值型或百分比型分类。通过Buff系统实现属性的动态叠加和计算确保战斗中的属性变化能够实时反映在UI界面中。
## 项目结构
英雄属性系统的核心文件分布在以下目录结构中:
```mermaid
graph TB
subgraph "属性配置层"
A[HeroAttrs.ts<br/>属性枚举与配置]
B[heroSet.ts<br/>英雄数据配置]
C[GameEvent.ts<br/>事件系统]
end
subgraph "实体管理层"
D[Hero.ts<br/>英雄实体]
E[HeroViewComp.ts<br/>视图组件]
F[BuffComp.ts<br/>缓冲组件]
end
subgraph "战斗系统"
G[Mon.ts<br/>怪物系统]
H[BuffComp.ts<br/>UI组件]
end
A --> D
B --> D
C --> E
D --> E
E --> F
G --> E
H --> F
```
**图表来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L50)
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L1-L30)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L50)
**章节来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L546)
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L1-L100)
## 核心组件
### 属性枚举系统
属性系统定义了完整的属性体系,涵盖战斗中的各个方面:
| 属性类别 | 属性数量 | 主要功能 | 示例属性 |
|---------|---------|---------|---------|
| 基础生存属性 | 6 | 生命值、魔法值、护盾 | HP_MAX, MP_MAX, SHIELD_MAX |
| 攻击属性 | 6 | 输出能力相关 | AP, MAP, AS, AREA_OF_EFFECT |
| 防御属性 | 7 | 防御能力相关 | DEF, MDEF, DODGE, BLOCK |
| 暴击与命中 | 5 | 命中率与暴击系统 | CRITICAL, CRITICAL_DMG, HIT |
| 特殊效果属性 | 10 | 特殊战斗效果 | LIFESTEAL, FREEZE_CHANCE, BURN_CHANCE |
| 增益效果属性 | 10 | 状态增强效果 | BUFF_UP, SPEED, EXP_GAIN |
### 属性类型系统
系统区分两种属性类型:
- **数值型属性VALUE**:直接加减的绝对数值,如攻击力、防御力
- **百分比型属性RATIO**:按百分比计算的相对数值,如暴击率、闪避率
**章节来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L142-L226)
## 架构概览
英雄属性系统采用分层架构设计,确保职责分离和模块化:
```mermaid
sequenceDiagram
participant Player as 玩家操作
participant Hero as Hero实体
participant View as HeroViewComp
participant Buff as Buff系统
participant UI as UI组件
Player->>Hero : 创建英雄
Hero->>View : hero_init()
View->>View : 初始化基础属性
View->>View : 初始化属性配置
View->>Buff : initAttrs()
Note over Player,UI : 属性计算流程
Player->>Buff : 添加Buff
Buff->>View : recalculateSingleAttr()
View->>View : 计算属性值
View->>UI : 更新UI显示
Note over Player,UI : 属性更新流程
Player->>Buff : 属性变更
Buff->>View : 触发重新计算
View->>UI : 实时更新显示
```
**图表来源**
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L65-L99)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L165-L250)
## 详细组件分析
### HeroAttrs.ts - 属性配置核心
HeroAttrs.ts定义了完整的属性体系和配置机制
#### 属性枚举设计
系统定义了105种属性按逻辑分组排列
```mermaid
classDiagram
class Attrs {
+HP_MAX : 0
+MP_MAX : 1
+SHIELD_MAX : 2
+AP : 10
+MAP : 11
+DEF : 20
+MDEF : 21
+CRITICAL : 30
+CRITICAL_DMG : 31
+LIFESTEAL : 50
+SPEED : 63
+STRENGTH : 90
+INTELLIGENCE : 91
+AGILITY : 92
+SPIRIT : 93
+LUCK : 94
}
class BType {
+VALUE : 0
+RATIO : 1
}
class NeAttrs {
+IN_FROST : 0
+IN_STUN : 1
+IN_BURN : 2
+IN_POISON : 3
}
Attrs --> BType : "类型分类"
Attrs --> NeAttrs : "负面状态"
```
**图表来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L10-L105)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L8-L10)
#### 属性类型配置
系统通过AttrsType配置表明确区分属性类型
| 属性类型 | 数值型属性 | 百分比型属性 | 混合型属性 |
|---------|-----------|-------------|-----------|
| 基础生存 | HP_MAX, MP_MAX, SHIELD_MAX | HEAL_EFFECT | - |
| 攻击属性 | AP, MAP, DIS, AREA_OF_EFFECT, PIERCE | AS, SKILL_DURATION | - |
| 防御属性 | DEF, MDEF | DODGE, BLOCK, DAMAGE_REDUCTION, THORNS | - |
| 特殊效果 | - | LIFESTEAL, MANASTEAL, FREEZE_CHANCE | - |
#### 职业属性成长系统
系统实现了基于职业的属性成长机制:
```mermaid
flowchart TD
A[基础属性输入] --> B{职业类型}
B --> |战士| C[战士成长配置]
B --> |远程| D[远程成长配置]
B --> |法师| E[法师成长配置]
B --> |辅助| F[辅助成长配置]
B --> |刺客| G[刺客成长配置]
C --> H[计算属性增长]
D --> H
E --> H
F --> H
G --> H
H --> I[返回属性增长值]
style A fill:#e1f5fe
style I fill:#c8e6c9
```
**图表来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L266-L439)
**章节来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L106-L226)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L266-L439)
### Hero.ts - 英雄实体管理
Hero.ts负责英雄实体的创建和基础属性初始化
#### 英雄初始化流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant Hero as Hero实体
participant Model as HeroModelComp
participant View as HeroViewComp
Client->>Hero : load(pos, scale, uuid)
Hero->>Hero : 查找空闲槽位
Hero->>Hero : 加载英雄预制体
Hero->>Hero : 设置位置和缩放
Hero->>Hero : hero_init(uuid, node)
Hero->>View : 初始化属性配置
Hero->>View : 设置基础属性值
Hero->>View : 初始化属性系统
Hero->>Model : 添加模型组件
Hero-->>Client : 英雄加载完成
```
**图表来源**
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L40-L99)
#### 基础属性设置
hero_init方法完成了英雄基础属性的初始化
| 属性类型 | 设置方式 | 默认值来源 |
|---------|---------|-----------|
| 基础属性 | 直接赋值 | HeroInfo配置 |
| 属性映射 | getAttrs() | 初始化为0 |
| 负面状态 | getNeAttrs() | 初始化为0 |
| 技能列表 | 循环遍历 | 技能配置表 |
**章节来源**
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L65-L99)
### HeroViewComp.ts - 属性计算与UI更新
HeroViewComp.ts是属性系统的核心计算引擎负责属性的动态计算和UI更新
#### 属性计算算法
系统实现了复杂的属性计算算法:
```mermaid
flowchart TD
A[属性计算请求] --> B[获取基础值]
B --> C[收集数值型Buff]
C --> D[收集百分比型Buff]
D --> E{属性类型判断}
E --> |百分比型| F[直接相加]
E --> |数值型| G[基础值×(1+百分比/100)+数值]
F --> H[属性值限制检查]
G --> H
H --> I{属性值验证}
I --> |超出范围| J[调整到合理值]
I --> |正常范围| K[更新属性值]
J --> K
K --> L[触发UI更新]
L --> M[完成计算]
style A fill:#e3f2fd
style M fill:#e8f5e8
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L254-L354)
#### Buff系统设计
Buff系统支持持久和临时两种类型的Buff叠加
| Buff类型 | 存储位置 | 生命周期 | 计算方式 |
|---------|---------|---------|---------|
| 持久Buff | BUFFS | 手动清除 | 直接累加 |
| 临时Buff | BUFFS_TEMP | 时间到期自动清除 | 时间递减计算 |
| 增益Buff | 正数值 | - | 属性提升 |
| 减益Buff | 负数值 | - | 属性削弱 |
#### 属性计算公式
系统根据不同属性类型采用不同的计算公式:
**百分比型属性公式**
```
最终值 = 基础值 + 所有数值型Buff之和 + 所有百分比Buff之和
```
**数值型属性公式**
```
最终值 = (基础值 + 所有数值型Buff之和) × (1 + 所有百分比Buff之和/100)
```
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L165-L354)
### BuffComp.ts - UI组件集成
BuffComp.ts负责将属性变化实时反映到UI界面上
#### UI更新机制
```mermaid
sequenceDiagram
participant Attr as 属性系统
participant View as HeroViewComp
participant Buff as BuffComp
participant UI as UI组件
Attr->>View : 属性值变更
View->>View : recalculateSingleAttr()
View->>Buff : hp_show/hp_mp_show
Buff->>UI : 更新进度条
Buff->>UI : 更新标签文本
UI->>UI : 动画效果展示
Note over Attr,UI : 实时更新流程
View->>Buff : show_shield
Buff->>UI : 更新护盾显示
UI->>UI : 护盾动画效果
Note over Attr,UI : 护盾更新流程
```
**图表来源**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L44-L80)
#### UI组件类型
BuffComp管理多种UI组件
| UI组件 | 功能 | 更新触发 |
|-------|------|---------|
| 血条 | 显示生命值 | hp_show |
| 能量条 | 显示魔法值 | mp_show |
| 护盾条 | 显示护盾值 | show_shield |
| 提示框 | 显示伤害数字 | tooltip |
| 状态图标 | 显示负面状态 | 状态切换 |
**章节来源**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L1-L80)
### Mon.ts - 怪物属性系统
Mon.ts继承了英雄的属性系统但针对怪物进行了优化
#### 怪物属性特点
| 属性类型 | 英雄 vs 怪物 | 设计差异 |
|---------|-------------|---------|
| 基础属性 | 多样化配置 | 固定基础值 |
| 成长属性 | 动态计算 | 预设固定值 |
| Buff系统 | 复杂计算 | 简化处理 |
| UI更新 | 实时同步 | 基础显示 |
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L87-L108)
## 依赖关系分析
英雄属性系统的依赖关系体现了清晰的分层架构:
```mermaid
graph TB
subgraph "配置层"
A[HeroAttrs.ts]
B[heroSet.ts]
C[GameEvent.ts]
end
subgraph "实体层"
D[Hero.ts]
E[HeroViewComp.ts]
F[BuffComp.ts]
end
subgraph "战斗层"
G[Mon.ts]
H[战斗系统]
end
A --> D
A --> E
B --> D
C --> E
D --> E
E --> F
G --> E
H --> E
style A fill:#e3f2fd
style D fill:#f3e5f5
style E fill:#e8f5e8
```
**图表来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L20)
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L1-L20)
### 模块间通信
系统通过事件机制实现模块间的松耦合通信:
| 通信方式 | 使用场景 | 实现方式 |
|---------|---------|---------|
| 直接调用 | 属性计算 | 方法调用 |
| 事件分发 | 状态同步 | GameEvent |
| UI更新 | 实时反馈 | 组件回调 |
| 数据绑定 | 状态管理 | MVVM模式 |
**章节来源**
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L1-L70)
## 性能考虑
### 属性计算优化
系统采用了多种性能优化策略:
1. **延迟计算**:只有在属性值发生变化时才重新计算
2. **批量更新**同一帧内的多个属性变更只触发一次UI更新
3. **缓存机制**:缓存常用的属性计算结果
4. **增量更新**:只更新受影响的属性,而不是全部重新计算
### 内存管理
- 使用对象池管理Buff实例
- 及时清理过期的临时Buff
- 避免频繁的属性值分配和回收
### UI渲染优化
- 使用Tween动画实现平滑的属性变化
- 批量更新UI组件减少重绘次数
- 使用可视区域裁剪避免不必要的渲染
## 故障排除指南
### 常见问题及解决方案
#### 属性计算异常
**问题现象**:属性值显示不正确或计算错误
**可能原因**
- Buff配置错误
- 属性类型判断失误
- 基础值设置错误
**解决步骤**
1. 检查HeroAttrs.ts中的属性类型配置
2. 验证Buff的BType设置
3. 确认基础属性值的正确性
#### UI更新延迟
**问题现象**属性变化后UI没有及时更新
**可能原因**
- UI更新频率不足
- 属性变更事件未正确触发
- 组件生命周期问题
**解决步骤**
1. 检查update方法中的UI更新逻辑
2. 验证属性变更事件的分发
3. 确认组件的生命周期状态
#### 性能问题
**问题现象**:大量英雄同时战斗时出现卡顿
**可能原因**
- 属性计算过于频繁
- UI更新过于密集
- 内存泄漏
**解决步骤**
1. 优化属性计算的频率
2. 实施属性变更的批量处理
3. 检查内存使用情况
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L385-L425)
## 结论
英雄属性系统通过精心设计的分层架构,实现了复杂而高效的属性管理机制。系统的主要优势包括:
1. **模块化设计**:清晰的职责分离使得系统易于维护和扩展
2. **灵活的属性类型**:支持数值型和百分比型属性的混合计算
3. **强大的Buff系统**支持持久和临时Buff的叠加计算
4. **实时UI同步**:确保属性变化能够即时反映在用户界面上
5. **性能优化**:通过多种优化策略保证系统的流畅运行
该系统为游戏提供了坚实的战斗基础,支持丰富的角色定制和战斗策略,是整个游戏体验的重要组成部分。随着游戏的发展,这套属性系统已经证明了其良好的扩展性和稳定性,能够适应未来更多的功能需求。

View File

@@ -0,0 +1,594 @@
# 英雄系统
<cite>
**本文档中引用的文件**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts)
- [Hero.ts](file://assets/script/game/hero/Hero.ts)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
</cite>
## 目录
1. [简介](#简介)
2. [系统架构概览](#系统架构概览)
3. [英雄属性系统](#英雄属性系统)
4. [技能系统](#技能系统)
5. [天赋系统](#天赋系统)
6. [状态管理系统](#状态管理系统)
7. [组件间通信机制](#组件间通信机制)
8. [关键功能实现](#关键功能实现)
9. [性能优化考虑](#性能优化考虑)
10. [总结](#总结)
## 简介
英雄系统是游戏的核心战斗机制负责管理英雄的属性、技能、天赋和状态。本系统采用模块化设计通过ECS架构实现组件间的松耦合通信支持复杂的战斗逻辑和动态效果管理。
## 系统架构概览
英雄系统采用分层架构设计,主要包含以下核心层次:
```mermaid
graph TB
subgraph "表现层"
HV[HeroViewComp<br/>英雄视图组件]
BC[BuffComp<br/>状态显示组件]
end
subgraph "控制层"
HC[Hero<br/>英雄实体]
SC[SkillConComp<br/>技能控制组件]
TC[TalComp<br/>天赋控制组件]
end
subgraph "配置层"
HA[HeroAttrs<br/>属性配置]
SS[SkillSet<br/>技能配置]
TS[TalSet<br/>天赋配置]
end
subgraph "数据层"
HM[HeroModelComp<br/>模型数据]
MM[MonModelComp<br/>怪物数据]
end
HC --> HV
HC --> HM
SC --> HV
TC --> HV
HV --> BC
HV --> HA
SC --> SS
TC --> TS
HV --> MM
```
**图表来源**
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L1-L100)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L100)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L50)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L1-L50)
## 英雄属性系统
### 属性枚举与分类
英雄属性系统定义了完整的战斗属性体系,按照功能分为多个类别:
```mermaid
classDiagram
class Attrs {
<<enumeration>>
+HP_MAX : 0
+MP_MAX : 1
+SHIELD_MAX : 2
+HP_REGEN : 3
+MP_REGEN : 4
+AP : 10
+MAP : 11
+DEF : 20
+MDEF : 21
+CRITICAL : 30
+CRITICAL_DMG : 31
+SPEED : 63
+EXP_GAIN : 64
+STRENGTH : 90
+INTELLIGENCE : 91
+AGILITY : 92
+SPIRIT : 93
+LUCK : 94
}
class BType {
<<enumeration>>
+VALUE : 0
+RATIO : 1
}
class HeroAttrs {
+getAttrs() Object
+isRatioAttr(attrType) boolean
+calculateAttributeGains() Object
+addStrength() Object
+addIntelligence() Object
+addAgility() Object
+addSpirit() Object
+addLuck() Object
}
HeroAttrs --> Attrs
HeroAttrs --> BType
```
**图表来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L15-L100)
### 属性类型配置
系统通过 `AttrsType` 配置表区分属性的计算方式:
| 属性类型 | 计算方式 | 示例属性 |
|---------|---------|---------|
| 数值型 | 直接相加 | HP_MAX, AP, DEF |
| 百分比型 | 基础值×(1+百分比/100) | CRITICAL, SPEED, BUFF_UP |
### 职业属性成长系统
不同职业具有独特的属性成长曲线:
```mermaid
flowchart TD
A[基础属性输入] --> B{职业类型}
B --> |战士| C[力量→HP_MAX:3, AP:1.5, DEF:0.8]
B --> |远程| D[敏捷→CRITICAL:0.8, DODGE:0.6, AS:0.5]
B --> |法师| E[智力→MP_MAX:2, MAP:1.8, MDEF:0.8]
B --> |辅助| F[精神→MP_MAX:2, CON_RES:0.5, BUFF_UP:0.6]
B --> |刺客| G[敏捷→CRITICAL:1, DODGE:0.8, AS:0.6]
C --> H[属性增长计算]
D --> H
E --> H
F --> H
G --> H
H --> I[最终属性值]
```
**图表来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L200-L400)
**章节来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L546)
## 技能系统
### 技能配置结构
技能系统提供了完整的技能数据定义框架:
```mermaid
classDiagram
class SkillConfig {
+uuid : number
+name : string
+TGroup : TGroup
+SType : SType
+DTType : DTType
+DType : DType
+ap : number
+cd : number
+cost : number
+speed : number
+buffs : BuffConf[]
+neAttrs : NeAttrsConf[]
+info : string
}
class TGroup {
<<enumeration>>
+Self : 0
+Ally : 1
+Team : 2
+Enemy : 3
+All : 4
}
class SType {
<<enumeration>>
+damage : 0
+heal : 1
+shield : 2
+buff : 11
}
class BuffConf {
+buff : Attrs
+BType : BType
+value : number
+time : number
+chance : number
}
SkillConfig --> TGroup
SkillConfig --> SType
SkillConfig --> BuffConf
```
**图表来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L80-L148)
### 技能控制逻辑
技能释放遵循严格的时序控制:
```mermaid
sequenceDiagram
participant Player as 玩家输入
participant SC as SkillConComp
participant HV as HeroViewComp
participant SE as SkillEnt
participant Target as 目标实体
Player->>SC : 技能冷却完成
SC->>SC : 检查英雄状态
SC->>HV : 选择目标
HV-->>SC : 返回目标坐标
SC->>HV : 播放技能特效
SC->>SE : 创建技能实体
SE->>Target : 执行伤害/效果
Target-->>SE : 反馈结果
SE-->>HV : 更新状态
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L50-L120)
### 目标选择算法
系统实现了智能的目标选择机制:
```mermaid
flowchart TD
A[开始目标选择] --> B[获取敌方实体列表]
B --> C{是否有目标?}
C --> |否| D[返回默认位置]
C --> |是| E[确定最前排目标]
E --> F[添加最前排为目标]
F --> G[随机选择剩余目标]
G --> H[返回目标坐标数组]
D --> I[结束]
H --> I
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L130-L170)
**章节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L1-L148)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
## 天赋系统
### 天赋类型与触发机制
天赋系统支持多种触发条件和效果类型:
```mermaid
classDiagram
class TalType {
<<enumeration>>
+LEVEL : 1
+LEVEL_UP : 2
+ACTION_COUNT : 3
+SKILL_COUNT : 4
+DAMAGE_COUNT : 5
+INIT : 6
+DEAD : 7
}
class TalEType {
<<enumeration>>
+ATTRS : 1
+SKILL : 2
+SKILL_MORE : 3
}
class ItalConf {
+uuid : number
+name : string
+desc : string
+type : TalType
+triggerType : TalEType
+chance : number
+t_value : number
+e_value : number
+e_name : number
+e_type : BType
+e_scaling : number
+e_count : number
+stackable : boolean
+maxStack : number
}
class FightStats {
+aCount : number
+sCount : number
+dCount : number
+level : number
}
ItalConf --> TalType
ItalConf --> TalEType
TalComp --> FightStats
```
**图表来源**
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L10-L50)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L15-L40)
### 天赋触发流程
```mermaid
flowchart TD
A[事件发生] --> B{事件类型}
B --> |等级提升| C[更新FStats.level]
B --> |普通攻击| D[更新aCount]
B --> |技能使用| E[更新sCount]
B --> |受到伤害| F[更新dCount]
C --> G[检查LEVEL天赋]
D --> H[检查ACTION_COUNT天赋]
E --> I[检查SKILL_COUNT天赋]
F --> J[检查DAMAGE_COUNT天赋]
G --> K{满足触发条件?}
H --> K
I --> K
J --> K
K --> |是| L[执行天赋效果]
K --> |否| M[等待下次检查]
L --> N[应用属性增益]
L --> O[触发技能]
L --> P[增加技能数量]
N --> Q[重新计算属性]
O --> R[技能释放]
P --> S[技能列表更新]
```
**图表来源**
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L120-L170)
**章节来源**
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L1-L116)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L1-L171)
## 状态管理系统
### Buff/Debuff系统架构
状态管理系统实现了完整的增益/减益效果管理:
```mermaid
classDiagram
class HeroViewComp {
+BUFFS : Record~number, Array~
+BUFFS_TEMP : Record~number, Array~
+NeAttrs : Record~number, Object~
+addBuff(buffConf) void
+removeBuff(attrIndex, value, isPermanent) void
+clearBuffs(attrIndex, isBuff) void
+recalculateSingleAttr(attrIndex) void
+updateTemporaryBuffsDebuffs(dt) void
}
class BuffInfo {
+attr : Attrs
+value : number
+remainTime : number
}
class NeAttrs {
+IN_FROST : 0
+IN_STUN : 1
+IN_BURN : 2
+IN_POISON : 3
}
HeroViewComp --> BuffInfo
HeroViewComp --> NeAttrs
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L80-L120)
### 属性计算公式
系统采用复合计算公式处理不同类型的属性:
| 属性类型 | 计算公式 | 说明 |
|---------|---------|------|
| 数值型 | `(基础值 + 所有数值型buff之和) × (1 + 所有百分比buff之和/100)` | 攻击力、防御力等 |
| 百分比型 | `基础值 + 所有数值型buff之和 + 所有百分比buff之和` | 暴击率、闪避率等 |
### 状态更新机制
```mermaid
sequenceDiagram
participant Game as 游戏循环
participant HV as HeroViewComp
participant Buff as Buff系统
participant Attr as 属性计算
Game->>HV : update(dt)
HV->>Buff : updateTemporaryBuffsDebuffs(dt)
Buff->>Buff : 减少剩余时间
Buff->>Buff : 移除过期buff
Buff->>Attr : recalculateSingleAttr()
Attr->>Attr : 重新计算属性值
Attr-->>HV : 更新后的属性
HV->>HV : clampSingleAttr()
HV-->>Game : 状态更新完成
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L400-L500)
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L780)
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L1-L213)
## 组件间通信机制
### ECS架构下的组件交互
```mermaid
graph LR
subgraph "英雄实体"
E[Hero实体]
HV[HeroViewComp]
HC[HeroConComp]
BM[BattleMoveComp]
end
subgraph "技能系统"
SC[SkillConComp]
SE[SkillEnt]
end
subgraph "状态系统"
BC[BuffComp]
TC[TalComp]
end
E --> HV
E --> HC
E --> BM
HC --> SC
SC --> SE
HV --> BC
HV --> TC
TC --> HV
SC --> HV
```
**图表来源**
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L15-L35)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L15-L30)
### 事件驱动通信
系统通过事件机制实现组件间的解耦通信:
| 事件类型 | 发送者 | 接收者 | 用途 |
|---------|-------|-------|------|
| GameEvent.MasterCalled | Hero | Talent系统 | 英雄召唤事件 |
| GameEvent.CastHeroSkill | SkillCon | 其他组件 | 技能释放通知 |
| GameEvent.FightEnd | Battle | 所有组件 | 战斗结束事件 |
| GameEvent.HeroDead | HeroView | Talent系统 | 英雄死亡事件 |
**章节来源**
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L1-L100)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L50)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L1-L50)
## 关键功能实现
### 技能释放流程
技能释放是英雄系统的核心功能,涉及多个组件的协调工作:
```mermaid
flowchart TD
A[玩家输入技能] --> B[SkillConComp接收]
B --> C{英雄状态检查}
C --> |眩晕/冰冻| D[阻止技能释放]
C --> |正常状态| E[检查冷却时间]
E --> |冷却完成| F[检查魔法值]
F --> |魔法值充足| G[选择目标]
F --> |魔法值不足| H[显示提示]
G --> I[播放技能特效]
I --> J[创建技能实体]
J --> K[执行伤害计算]
K --> L[应用Buff效果]
L --> M[更新英雄状态]
D --> N[技能释放失败]
H --> N
M --> O[技能释放成功]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L50-L100)
### 属性升级系统
属性升级通过职业成长配置实现:
```mermaid
flowchart TD
A[属性点分配] --> B{职业类型}
B --> |力量| C[addStrength函数]
B --> |智力| D[addIntelligence函数]
B --> |敏捷| E[addAgility函数]
B --> |精神| F[addSpirit函数]
B --> |幸运| G[addLuck函数]
C --> H[计算力量成长]
D --> I[计算智力成长]
E --> J[计算敏捷成长]
F --> K[计算精神成长]
G --> L[计算幸运成长]
H --> M[应用到属性]
I --> M
J --> M
K --> M
L --> M
M --> N[重新计算所有属性]
N --> O[更新显示]
```
**图表来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L500-L546)
### 天赋触发机制
天赋系统实现了复杂的触发逻辑:
```mermaid
flowchart TD
A[事件触发] --> B[更新统计数据]
B --> C[遍历天赋配置]
C --> D{检查触发条件}
D --> |满足| E[计算触发概率]
D --> |不满足| F[跳过此天赋]
E --> |触发| G[执行天赋效果]
E --> |不触发| F
G --> H{效果类型}
H --> |属性增益| I[添加Buff]
H --> |技能触发| J[释放技能]
H --> |技能增加| K[增加技能列表]
I --> L[重新计算属性]
J --> M[技能执行]
K --> N[技能可用]
L --> O[更新界面]
M --> O
N --> O
F --> P[检查下一个天赋]
P --> C
```
**图表来源**
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L100-L170)
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L50-L177)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L500-L546)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L100-L171)
## 性能优化考虑
### 内存管理优化
1. **对象池化**: 技能实体和伤害数字使用对象池减少GC压力
2. **延迟加载**: 天赋效果按需计算,避免不必要的属性重计算
3. **弱引用**: 避免组件间的强引用导致内存泄漏
### 计算优化
1. **增量计算**: 只重新计算受影响的属性,而不是全部属性
2. **缓存机制**: 缓存属性计算结果,避免重复计算
3. **批量更新**: 在同一帧内批量处理多个状态变化
### 渲染优化
1. **状态显示**: BuffComp只更新可见的状态信息
2. **特效管理**: 技能特效使用预制体池,避免频繁创建销毁
3. **层级管理**: 合理管理UI层级减少渲染开销
## 总结
英雄系统通过模块化设计和ECS架构实现了高度可扩展和可维护的战斗机制。系统的主要特点包括
1. **完整的属性体系**: 支持数值型和百分比型属性的灵活组合
2. **智能技能管理**: 提供丰富的技能配置选项和自动化的目标选择
3. **动态天赋系统**: 支持多种触发条件和效果类型的天赋配置
4. **高效状态管理**: 实现了完整的Buff/Debuff生命周期管理
5. **松耦合架构**: 通过ECS和事件机制实现组件间的解耦通信
该系统为游戏提供了坚实的战斗基础,支持复杂的游戏玩法和深度的角色养成体验。通过合理的架构设计和性能优化,确保了系统的稳定性和可扩展性。