# 技能冷却管理系统 **本文档引用的文件** - [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) ## 目录 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. **灵活的状态控制**:支持各种游戏状态下的冷却处理 ### 设计亮点 - **模块化架构**:清晰的职责分离和组件交互 - **资源优化**:智能的状态检查避免不必要的计算 - **错误处理**:完善的异常情况处理机制 - **扩展性**:良好的接口设计支持功能扩展 ### 性能考虑 系统通过智能的状态检查和条件判断,有效减少了不必要的计算开销,在保证功能完整性的同时维持了良好的性能表现。 这个技能冷却管理系统为游戏提供了稳定可靠的技能控制机制,是游戏战斗系统的重要组成部分。