wiki更新

This commit is contained in:
panw
2025-10-30 16:49:19 +08:00
parent 40e0086be3
commit 93ceaa70e4
18 changed files with 746 additions and 1100 deletions

View File

@@ -1,390 +0,0 @@
# 多段连发技能执行机制深度解析
<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

@@ -1,440 +0,0 @@
# 技能冷却管理系统
<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

@@ -1,359 +0,0 @@
# 技能执行机制
<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

@@ -1,506 +0,0 @@
# 技能执行资源管理
<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

@@ -1,474 +0,0 @@
# 目标选择策略
<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

@@ -1,769 +0,0 @@
# 技能系统
<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

@@ -1,524 +0,0 @@
# 技能配置表结构
<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

@@ -2,15 +2,21 @@
<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)
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts) - *更新了属性类型和职业成长配置*
- [Hero.ts](file://assets\script\game\hero\Hero.ts) - *更新了英雄实体初始化逻辑*
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts) - *重构了属性组件,包含攻击状态管理*
- [HeroViewComp.ts](file://assets\game\hero\HeroViewComp.ts) - *更新了视图组件,移除了攻击状态管理*
- [heroSet.ts](file://assets\script\game\common\config\heroSet.ts) - *包含了英雄配置数据*
- [GameEvent.ts](file://assets\script\game\common\config\GameEvent.ts) - *定义了游戏事件系统*
</cite>
## 更新摘要
**主要变更**
- **架构重构**:将`is_atking`攻击状态从`HeroViewComp`视图层迁移至`HeroAttrsComp`数据层,实现状态管理集中化
- **ECS架构优化**:为`HeroAttrSystem`等系统添加ECS注册装饰器使架构更符合标准
- **职责分离**`HeroViewComp`不再管理攻击状态仅负责UI表现和动画控制
- **代码维护性提升**:通过将状态管理集中在数据层,提高了代码的可维护性和测试性
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
@@ -24,10 +30,12 @@
## 简介
英雄属性系统是游戏《heroes》的核心战斗机制之一负责管理英雄的基础属性、成长属性、动态计算以及战斗中的实时更新。该系统采用模块化设计通过HeroAttrs.ts定义属性枚举和配置Hero.ts实现英雄实体管理HeroViewComp.ts处理属性计算和UI更新,形成了完整的属性管理体系。
英雄属性系统是游戏《heroes》的核心战斗机制之一负责管理英雄的基础属性、成长属性、动态计算以及战斗中的实时更新。该系统采用模块化设计通过HeroAttrs.ts定义属性枚举和配置Hero.ts实现英雄实体管理HeroAttrsComp.ts处理属性计算和状态管理,形成了完整的属性管理体系。
系统支持多种属性类型包括基础生存属性、攻击属性、防御属性、特殊效果属性等每种属性都有明确的数值型或百分比型分类。通过Buff系统实现属性的动态叠加和计算确保战斗中的属性变化能够实时反映在UI界面中。
**更新说明**:根据最新代码重构,攻击状态`is_atking`已从视图层`HeroViewComp`迁移至数据层`HeroAttrsComp`实现了状态管理的集中化。这一变更遵循了ECS架构的最佳实践将数据状态与表现逻辑分离提高了系统的可维护性和扩展性。
## 项目结构
英雄属性系统的核心文件分布在以下目录结构中:
@@ -41,12 +49,12 @@ C[GameEvent.ts<br/>事件系统]
end
subgraph "实体管理层"
D[Hero.ts<br/>英雄实体]
E[HeroViewComp.ts<br/>视图组件]
F[BuffComp.ts<br/>缓冲组件]
E[HeroAttrsComp.ts<br/>属性组件]
F[HeroViewComp.ts<br/>视图组件]
end
subgraph "战斗系统"
G[Mon.ts<br/>怪物系统]
H[BuffComp.ts<br/>UI组件]
H[BuffComp.ts<br/>缓冲组件]
end
A --> D
B --> D
@@ -58,13 +66,13 @@ 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-L50)
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L1-L30)
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.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)
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L1-L546)
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L1-L100)
## 核心组件
@@ -88,7 +96,7 @@ H --> F
- **百分比型属性RATIO**:按百分比计算的相对数值,如暴击率、闪避率
**章节来源**
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L142-L226)
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L142-L226)
## 架构概览
@@ -98,28 +106,30 @@ H --> F
sequenceDiagram
participant Player as 玩家操作
participant Hero as Hero实体
participant Attrs as HeroAttrsComp
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()
Hero->>Attrs : hero_init()
Attrs->>Attrs : 初始化基础属性
Attrs->>Attrs : 初始化属性配置
Attrs->>Buff : initAttrs()
Note over Player,UI : 属性计算流程
Player->>Buff : 添加Buff
Buff->>View : recalculateSingleAttr()
View->>View : 计算属性值
View->>UI : 更新UI显示
Buff->>Attrs : recalculateSingleAttr()
Attrs->>Attrs : 计算属性值
Attrs->>UI : 更新UI显示
Note over Player,UI : 属性更新流程
Player->>Buff : 属性变更
Buff->>View : 触发重新计算
View->>UI : 实时更新显示
Player->>Attrs : 攻击状态变更
Attrs->>Attrs : is_atking=true
Attrs->>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)
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L65-L99)
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts#L165-L250)
## 详细组件分析
@@ -166,8 +176,8 @@ 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)
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L10-L105)
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L8-L10)
#### 属性类型配置
@@ -203,11 +213,11 @@ 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#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)
- [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 - 英雄实体管理
@@ -219,22 +229,22 @@ Hero.ts负责英雄实体的创建和基础属性初始化
sequenceDiagram
participant Client as 客户端
participant Hero as Hero实体
participant Model as HeroModelComp
participant Model as HeroAttrsComp
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->>Model : 设置基础属性值
Hero->>Model : 初始化属性系统
Hero->>Model : 添加模型组件
Hero-->>Client : 英雄加载完成
```
**图表来源**
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L40-L99)
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L40-L99)
#### 基础属性设置
@@ -248,11 +258,11 @@ hero_init方法完成了英雄基础属性的初始化
| 技能列表 | 循环遍历 | 技能配置表 |
**章节来源**
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L65-L99)
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L65-L99)
### HeroViewComp.ts - 属性计算与UI更新
### HeroAttrsComp.ts - 属性计算与状态管理
HeroViewComp.ts是属性系统的核心计算引擎负责属性的动态计算和UI更新
HeroAttrsComp.ts是属性系统的核心计算引擎负责属性的动态计算和状态管理
#### 属性计算算法
@@ -279,39 +289,30 @@ style M fill:#e8f5e8
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L254-L354)
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts#L254-L354)
#### Buff系统设计
#### 状态管理重构
Buff系统支持持久和临时两种类型的Buff叠加
根据最新代码重构,`is_atking`攻击状态已从视图层迁移至数据层
| Buff类型 | 存储位置 | 生命周期 | 计算方式 |
|---------|---------|---------|---------|
| 持久Buff | BUFFS | 手动清除 | 直接累加 |
| 临时Buff | BUFFS_TEMP | 时间到期自动清除 | 时间递减计算 |
| 增益Buff | 正数值 | - | 属性提升 |
| 减益Buff | 负数值 | - | 属性削弱 |
#### 属性计算公式
系统根据不同属性类型采用不同的计算公式:
**百分比型属性公式**
```
最终值 = 基础值 + 所有数值型Buff之和 + 所有百分比Buff之和
```typescript
// HeroAttrsComp.ts - 数据层状态管理
export class HeroAttrsComp extends ecs.Comp {
// ... 其他属性
is_atking: boolean = false; // 是否正在攻击
is_stop: boolean = false; // 是否正在停止
// ... 其他状态
}
```
**数值型属性公式**
```
最终值 = (基础值 + 所有数值型Buff之和) × (1 + 所有百分比Buff之和/100)
```
这一变更实现了状态管理的集中化符合ECS架构的最佳实践。
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L165-L354)
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts#L7-L380)
### BuffComp.ts - UI组件集成
### HeroViewComp.ts - UI更新与动画控制
BuffComp.ts负责将属性变化实时反映到UI界面上
HeroViewComp.ts现在仅负责UI表现和动画控制不再管理攻击状态
#### UI更新机制
@@ -335,11 +336,11 @@ Note over Attr,UI : 护盾更新流程
```
**图表来源**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L44-L80)
- [HeroViewComp.ts](file://assets\script\game\hero\HeroViewComp.ts#L44-L80)
#### UI组件类型
BuffComp管理多种UI组件
HeroViewComp管理多种UI组件
| UI组件 | 功能 | 更新触发 |
|-------|------|---------|
@@ -350,7 +351,7 @@ BuffComp管理多种UI组件
| 状态图标 | 显示负面状态 | 状态切换 |
**章节来源**
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L1-L80)
- [HeroViewComp.ts](file://assets\script\game\hero\HeroViewComp.ts#L1-L80)
### Mon.ts - 怪物属性系统
@@ -366,7 +367,7 @@ Mon.ts继承了英雄的属性系统但针对怪物进行了优化
| UI更新 | 实时同步 | 基础显示 |
**章节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L87-L108)
- [Mon.ts](file://assets\script\game\hero\Mon.ts#L87-L108)
## 依赖关系分析
@@ -381,8 +382,8 @@ C[GameEvent.ts]
end
subgraph "实体层"
D[Hero.ts]
E[HeroViewComp.ts]
F[BuffComp.ts]
E[HeroAttrsComp.ts]
F[HeroViewComp.ts]
end
subgraph "战斗层"
G[Mon.ts]
@@ -402,8 +403,8 @@ 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)
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L1-L20)
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L1-L20)
### 模块间通信
@@ -417,7 +418,7 @@ style E fill:#e8f5e8
| 数据绑定 | 状态管理 | MVVM模式 |
**章节来源**
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L1-L70)
- [GameEvent.ts](file://assets\script\game\common\config\GameEvent.ts#L1-L70)
## 性能考虑
@@ -486,7 +487,7 @@ style E fill:#e8f5e8
3. 检查内存使用情况
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L385-L425)
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts#L385-L425)
## 结论
@@ -498,4 +499,6 @@ style E fill:#e8f5e8
4. **实时UI同步**:确保属性变化能够即时反映在用户界面上
5. **性能优化**:通过多种优化策略保证系统的流畅运行
**架构演进**:最新的代码重构将`is_atking`攻击状态从视图层迁移至数据层实现了状态管理的集中化。这一变更遵循了ECS架构的最佳实践提高了代码的可维护性和测试性。通过将数据状态与表现逻辑分离系统变得更加健壮和可扩展。
该系统为游戏提供了坚实的战斗基础,支持丰富的角色定制和战斗策略,是整个游戏体验的重要组成部分。随着游戏的发展,这套属性系统已经证明了其良好的扩展性和稳定性,能够适应未来更多的功能需求。

View File

@@ -7,12 +7,35 @@
- [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)
- [HSkillSystem.ts](file://assets/script/game/hero/HSkillSystem.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)
- [HeroAttrsComp.ts](file://assets/script/game/hero/HeroAttrsComp.ts)
- [HeroAtk.ts](file://assets/script/game/hero/HeroAtk.ts)
- [EBusComp.ts](file://assets/script/game/hero/EBusComp.ts)
</cite>
## 更新摘要
**变更内容**
- 移除了 `SkillConComp` 组件重构为基于ECS系统的技能控制机制
-`is_atking` 攻击状态从视图层 `HeroViewComp` 迁移到数据层 `HeroAttrsComp`
- 拆分通用移动组件为专属的英雄和怪物移动系统
- 在攻击和死亡事件中集成视觉反馈
- 根据ECS框架重构角色视图和数据逻辑新增事件总线组件 `EBusComp`
**新增章节**
- ECS架构下的技能系统
- 攻击与死亡事件的视觉反馈
**已移除章节**
- 原有的 `SkillConComp` 技能控制组件相关内容
**来源追踪系统更新**
- 更新了受影响文件的引用链接和行号范围
- 添加了新组件和系统的文件引用
- 标记了已移除组件的废弃状态
## 目录
1. [简介](#简介)
2. [系统架构概览](#系统架构概览)
@@ -27,7 +50,7 @@
## 简介
英雄系统是游戏的核心战斗机制负责管理英雄的属性、技能、天赋和状态。本系统采用模块化设计通过ECS架构实现组件间的松耦合通信支持复杂的战斗逻辑和动态效果管理。
英雄系统是游戏的核心战斗机制负责管理英雄的属性、技能、天赋和状态。本系统采用模块化设计通过ECS架构实现组件间的松耦合通信支持复杂的战斗逻辑和动态效果管理。近期重构移除了 `SkillConComp` 组件将技能控制逻辑迁移至基于ECS系统的 `HSkillSystem`,同时将攻击状态从视图层迁移至数据层,实现了更合理的数据与表现分离。
## 系统架构概览
@@ -41,25 +64,26 @@ BC[BuffComp<br/>状态显示组件]
end
subgraph "控制层"
HC[Hero<br/>英雄实体]
SC[SkillConComp<br/>技能控制组件]
SS[HSkillSystem<br/>技能系统]
TC[TalComp<br/>天赋控制组件]
end
subgraph "配置层"
HA[HeroAttrs<br/>属性配置]
SS[SkillSet<br/>技能配置]
SSC[SkillSet<br/>技能配置]
TS[TalSet<br/>天赋配置]
end
subgraph "数据层"
HAC[HeroAttrsComp<br/>属性数据组件]
HM[HeroModelComp<br/>模型数据]
MM[MonModelComp<br/>怪物数据]
end
HC --> HV
HC --> HM
SC --> HV
HC --> HAC
SS --> HV
TC --> HV
HV --> BC
HV --> HA
SC --> SS
SS --> SSC
TC --> TS
HV --> MM
```
@@ -67,7 +91,7 @@ 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)
- [HSkillSystem.ts](file://assets/script/game/hero/HSkillSystem.ts#L1-L50)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L1-L50)
## 英雄属性系统
@@ -209,18 +233,54 @@ SkillConfig --> BuffConf
**图表来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L80-L148)
### 技能控制逻辑
### ECS架构下的技能系统
技能释放遵循严格的时序控制
技能系统已重构为基于ECS的系统架构主要包含以下组件
```mermaid
classDiagram
class CastSkillRequestComp {
+skillIndex : number
+targetPositions : Vec3[]
+reset() void
}
class SkillCastSystem {
+filter() IMatcher
+entityEnter(e : Entity) void
+checkCastConditions() boolean
+executeCast() void
+createSkillEntity() void
}
class SkillCDSystem {
+filter() IMatcher
+update(e : Entity) void
+updateCDs(dt : number) void
}
class SkillAutocastSystem {
+filter() IMatcher
+update(e : Entity) void
+selectTargets() Vec3[]
}
CastSkillRequestComp --> SkillCastSystem
SkillCastSystem --> SkillCDSystem
SkillAutocastSystem --> CastSkillRequestComp
```
**章节来源**
- [HSkillSystem.ts](file://assets/script/game/hero/HSkillSystem.ts#L1-L271)
### 技能施法流程
技能施法遵循ECS标记组件驱动的时序控制
```mermaid
sequenceDiagram
participant Player as 玩家输入
participant SC as SkillConComp
participant SC as SkillAutocastSystem
participant HV as HeroViewComp
participant SE as SkillEnt
participant Target as 目标实体
Player->>SC : 技能冷却完成
Player->>SC : 添加CastSkillRequest
SC->>SC : 检查英雄状态
SC->>HV : 选择目标
HV-->>SC : 返回目标坐标
@@ -232,7 +292,7 @@ SE-->>HV : 更新状态
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L50-L120)
- [HSkillSystem.ts](file://assets/script/game/hero/HSkillSystem.ts#L100-L150)
### 目标选择算法
@@ -252,11 +312,11 @@ H --> I
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L130-L170)
- [HSkillSystem.ts](file://assets/script/game/hero/HSkillSystem.ts#L200-L250)
**章节来源**
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L1-L148)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
- [HSkillSystem.ts](file://assets/script/game/hero/HSkillSystem.ts#L1-L271)
## 天赋系统
@@ -355,7 +415,7 @@ P --> S[技能列表更新]
```mermaid
classDiagram
class HeroViewComp {
class HeroAttrsComp {
+BUFFS : Record~number, Array~
+BUFFS_TEMP : Record~number, Array~
+NeAttrs : Record~number, Object~
@@ -376,12 +436,12 @@ class NeAttrs {
+IN_BURN : 2
+IN_POISON : 3
}
HeroViewComp --> BuffInfo
HeroViewComp --> NeAttrs
HeroAttrsComp --> BuffInfo
HeroAttrsComp --> NeAttrs
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L80-L120)
- [HeroAttrsComp.ts](file://assets/script/game/hero/HeroAttrsComp.ts#L80-L120)
### 属性计算公式
@@ -397,25 +457,25 @@ HeroViewComp --> NeAttrs
```mermaid
sequenceDiagram
participant Game as 游戏循环
participant HV as HeroViewComp
participant HAC as HeroAttrsComp
participant Buff as Buff系统
participant Attr as 属性计算
Game->>HV : update(dt)
HV->>Buff : updateTemporaryBuffsDebuffs(dt)
Game->>HAC : update(dt)
HAC->>Buff : updateTemporaryBuffsDebuffs(dt)
Buff->>Buff : 减少剩余时间
Buff->>Buff : 移除过期buff
Buff->>Attr : recalculateSingleAttr()
Attr->>Attr : 重新计算属性值
Attr-->>HV : 更新后的属性
HV->>HV : clampSingleAttr()
HV-->>Game : 状态更新完成
Attr-->>HAC : 更新后的属性
HAC->>HAC : clampSingleAttr()
HAC-->>Game : 状态更新完成
```
**图表来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L400-L500)
- [HeroAttrsComp.ts](file://assets/script/game/hero/HeroAttrsComp.ts#L400-L500)
**章节来源**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L780)
- [HeroAttrsComp.ts](file://assets/script/game/hero/HeroAttrsComp.ts#L1-L489)
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L1-L213)
## 组件间通信机制
@@ -427,11 +487,11 @@ graph LR
subgraph "英雄实体"
E[Hero实体]
HV[HeroViewComp]
HC[HeroConComp]
BM[BattleMoveComp]
HAC[HeroAttrsComp]
BM[HeroMoveComp]
end
subgraph "技能系统"
SC[SkillConComp]
SS[HSkillSystem]
SE[SkillEnt]
end
subgraph "状态系统"
@@ -439,19 +499,19 @@ BC[BuffComp]
TC[TalComp]
end
E --> HV
E --> HC
E --> HAC
E --> BM
HC --> SC
SC --> SE
HAC --> SS
SS --> SE
HV --> BC
HV --> TC
TC --> HV
SC --> HV
SS --> HV
```
**图表来源**
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L15-L35)
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L15-L30)
- [HSkillSystem.ts](file://assets/script/game/hero/HSkillSystem.ts#L15-L30)
### 事件驱动通信
@@ -460,13 +520,13 @@ SC --> HV
| 事件类型 | 发送者 | 接收者 | 用途 |
|---------|-------|-------|------|
| GameEvent.MasterCalled | Hero | Talent系统 | 英雄召唤事件 |
| GameEvent.CastHeroSkill | SkillCon | 其他组件 | 技能释放通知 |
| GameEvent.CastHeroSkill | HSkillSystem | 其他组件 | 技能释放通知 |
| 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)
- [HSkillSystem.ts](file://assets/script/game/hero/HSkillSystem.ts#L1-L50)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L1-L50)
## 关键功能实现
@@ -477,7 +537,7 @@ SC --> HV
```mermaid
flowchart TD
A[玩家输入技能] --> B[SkillConComp接收]
A[玩家输入技能] --> B[HSkillSystem接收]
B --> C{英雄状态检查}
C --> |眩晕/冰冻| D[阻止技能释放]
C --> |正常状态| E[检查冷却时间]
@@ -495,7 +555,7 @@ M --> O[技能释放成功]
```
**图表来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L50-L100)
- [HSkillSystem.ts](file://assets/script/game/hero/HSkillSystem.ts#L50-L100)
### 属性升级系统
@@ -557,10 +617,38 @@ P --> C
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L100-L170)
**章节来源**
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L50-L177)
- [HSkillSystem.ts](file://assets/script/game/hero/HSkillSystem.ts#L50-L271)
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L500-L546)
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L100-L171)
### 攻击与死亡事件的视觉反馈
攻击和死亡事件现在集成视觉反馈,增强游戏表现力:
```mermaid
sequenceDiagram
participant Attack as 攻击事件
participant HAC as HeroAttrsComp
participant HV as HeroViewComp
participant AtkSys as HeroAtkSystem
Attack->>HAC : 发起攻击
HAC->>AtkSys : doAttack()
AtkSys->>HV : do_atked()
HV->>HV : 显示伤害数字
HV->>HV : 播放受击动画
HV->>HV : 角色后退
Attack->>HAC : 造成伤害
HAC->>HAC : 更新血量
HAC->>HV : 检查死亡
HV->>HV : do_dead()
HV->>HV : 播放死亡特效
HV->>HV : 触发死亡事件
```
**章节来源**
- [HeroAtk.ts](file://assets/script/game/hero/HeroAtk.ts#L1-L247)
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L200-L300)
## 性能优化考虑
### 内存管理优化
@@ -591,4 +679,4 @@ P --> C
4. **高效状态管理**: 实现了完整的Buff/Debuff生命周期管理
5. **松耦合架构**: 通过ECS和事件机制实现组件间的解耦通信
该系统为游戏提供了坚实的战斗基础,支持复杂的游戏玩法和深度的角色养成体验。通过合理的架构设计和性能优化,确保了系统的稳定性和可扩展性。
近期重构将技能控制逻辑迁移至ECS系统移除了 `SkillConComp` 组件,同时将攻击状态从视图层迁移至数据层,实现了更合理的数据与表现分离。该系统为游戏提供了坚实的战斗基础,支持复杂的游戏玩法和深度的角色养成体验。通过合理的架构设计和性能优化,确保了系统的稳定性和可扩展性。