13 KiB
技能冷却管理系统
**本文档引用的文件** - [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)目录
简介
SkillConComp是游戏技能冷却管理系统的核心组件,负责维护和管理角色技能的冷却状态。该系统采用基于update循环的帧累加机制,通过精确的时间累积和多重条件判断来实现智能的技能触发逻辑。系统不仅处理技能冷却计算,还集成状态检测、资源管理和生命周期控制等功能。
系统架构概览
技能冷却管理系统采用分层架构设计,主要由以下层次组成:
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组件
SkillConComp是技能冷却管理的主要控制器,继承自CCComp基类,实现了完整的冷却逻辑和生命周期管理。
主要属性和方法
| 属性/方法 | 类型 | 描述 | 默认值 |
|---|---|---|---|
| HeroView | any | 关联的HeroView组件 | null |
| HeroEntity | any | 关联的实体对象 | null |
| TALCOMP | any | 技能组件 | null |
| skill_cd | number | 全局技能冷却 | 0 |
| _timers | object | 定时器集合 | {} |
生命周期管理
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()
图表来源
节来源
HeroViewComp组件
HeroViewComp作为技能状态的承载者,提供了技能列表管理和状态查询功能。
技能状态管理
| 状态属性 | 类型 | 描述 | 用途 |
|---|---|---|---|
| skills | array | 当前技能列表 | 存储技能配置和冷却状态 |
| mp | number | 当前魔法值 | 冷却触发条件之一 |
| is_atking | boolean | 是否处于攻击状态 | 影响技能触发时机 |
节来源
冷却机制实现
帧累加冷却计算
技能冷却采用基于update循环的帧累加机制,每帧将deltaTime累加到技能的当前冷却时间上。
冷却计算流程
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
图表来源
双重条件判断逻辑
冷却触发采用严格的双重条件判断机制:
- 冷却时间条件:
skills[i].cd > skills[i].cd_max - 魔法值条件:
this.HeroView.mp >= skills[i].cost
只有当这两个条件同时满足时,技能才会被触发。
节来源
技能触发机制
触发条件详解
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[执行技能逻辑]
图表来源
节来源
状态管理与控制流
游戏状态检测
系统通过多个层面的状态检测来决定是否进行冷却计算:
状态检查层次
| 检查层级 | 检查内容 | 实现位置 | 作用 |
|---|---|---|---|
| Mission状态 | smc.mission.play |
update方法 | 检查整体游戏状态 |
| Pause状态 | smc.mission.pause |
update方法 | 检查暂停状态 |
| 状态异常 | this.HeroView.isStun() |
update方法 | 检查眩晕状态 |
| 状态异常 | this.HeroView.isFrost() |
update方法 | 检查冰冻状态 |
状态检测流程
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 : 执行冷却计算
图表来源
节来源
非战斗状态处理
在非战斗状态下,系统会完全跳过冷却计算,确保资源的有效利用:
非战斗状态判断
// 非战斗状态检查逻辑
if(!smc.mission.play || smc.mission.pause) return
这种设计避免了在菜单界面、加载画面等非战斗状态下进行不必要的计算开销。
节来源
定时器资源管理
定时器生命周期
SkillConComp实现了完整的定时器生命周期管理,包括创建、使用和清理三个阶段。
定时器管理架构
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
图表来源
定时器清理机制
系统提供了多种定时器清理机制:
| 清理方式 | 触发条件 | 实现方法 | 作用范围 |
|---|---|---|---|
| 战斗结束清理 | GameEvent.FightEnd | clear_timer() | 所有定时器 |
| 组件销毁清理 | onDestroy() | onDestroy() | 当前组件 |
| 手动重置清理 | reset() | reset() | 当前组件 |
节来源
资源释放过程
定时器释放流程
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对象
图表来源
节来源
最佳实践指南
暂停状态下的冷却处理
在游戏暂停状态下,系统会完全跳过冷却计算,这是推荐的最佳实践:
暂停状态处理
// 推荐的暂停状态处理
update(dt: number) {
if(!smc.mission.play || smc.mission.pause) return
// 冷却计算逻辑
}
这种方式确保了在暂停状态下不会产生额外的计算开销,同时保持了冷却状态的准确性。
战斗结束后的清理
战斗结束后必须及时清理定时器资源,避免内存泄漏:
战斗结束清理
// 战斗结束事件监听
init(): void {
this.on(GameEvent.FightEnd, this.clear_timer, this);
}
// 清理方法实现
public clear_timer() {
Object.values(this._timers).forEach(clearTimeout);
}
非play状态的处理
在非战斗状态(如菜单界面)下,系统会自动跳过冷却计算:
非play状态检查
// 非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状态
- 确认技能配置正确
调试技巧
冷却状态监控
// 添加调试日志
update(dt: number) {
console.log(`冷却状态 - play: ${smc.mission.play}, pause: ${smc.mission.pause}`);
console.log(`技能冷却 - 当前mp: ${this.HeroView.mp}`);
}
定时器状态检查
// 定时器状态监控
public debugTimers() {
console.log('当前定时器:', Object.keys(this._timers));
console.log('定时器数量:', Object.values(this._timers).length);
}
总结
SkillConComp技能冷却管理系统是一个设计精良的组件,具有以下特点:
核心优势
- 精确的帧累加机制:基于update循环的冷却计算确保了时间精度
- 多重条件判断:双条件触发机制保证了技能使用的合理性
- 完善的生命周期管理:从创建到销毁的完整资源管理
- 灵活的状态控制:支持各种游戏状态下的冷却处理
设计亮点
- 模块化架构:清晰的职责分离和组件交互
- 资源优化:智能的状态检查避免不必要的计算
- 错误处理:完善的异常情况处理机制
- 扩展性:良好的接口设计支持功能扩展
性能考虑
系统通过智能的状态检查和条件判断,有效减少了不必要的计算开销,在保证功能完整性的同时维持了良好的性能表现。
这个技能冷却管理系统为游戏提供了稳定可靠的技能控制机制,是游戏战斗系统的重要组成部分。