# 新技能系统 - 快速开始 ## 🚀 3步开始使用 ### **步骤 1:注册系统到 Main.ts** ```typescript // Main.ts import { SkillCastSystem, SkillCDSystem, SkillAutocastSystem } from './game/hero/HSkillSystem'; protected async initEcsSystem() { // 技能系统(按顺序) oops.ecs.add(new SkillCDSystem()); // CD更新 oops.ecs.add(new SkillAutocastSystem()); // 自动施法 oops.ecs.add(new SkillCastSystem()); // 施法执行 } ``` --- ### **步骤 2:角色已自动拥有技能** ✅ `Hero.ts` 和 `Mon.ts` 已自动添加 `HeroSkillsComp` ✅ 加载角色时自动初始化技能 ✅ 无需手动配置 ```typescript // Hero.ts - load() 方法已自动处理 skillsComp.initSkills(hero.skills); // ✅ 已完成 ``` --- ### **步骤 3:技能自动施放!** **无需额外代码**,系统会自动处理: ```typescript // 每帧自动运行: // 1. SkillCDSystem 更新CD // 2. SkillAutocastSystem 检测可施放技能 // ├─ CD好了? ✅ // ├─ MP够? ✅ // ├─ 正在攻击? ✅ // └─ 添加 CastSkillRequestComp 标记 // 3. SkillCastSystem 执行施法 // ├─ 检查条件 // ├─ 扣除MP // ├─ 重置CD // ├─ 播放动画 // └─ 创建技能实体 ``` --- ## 🎮 进阶使用 ### **手动施法(玩家点击技能按钮)** ```typescript // UI 按钮点击事件 onSkillButton1Clicked() { const skillCon = this.heroNode.getComponent(SkillConComp); skillCon.manualCastSkill(0); // 施放第0个技能 } onSkillButton2Clicked() { const skillCon = this.heroNode.getComponent(SkillConComp); skillCon.manualCastSkill(1); // 施放第1个技能 } ``` --- ### **强制施法(天赋触发、事件触发)** ```typescript // 天赋系统 doTalentEffect(heroEntity: ecs.Entity) { const request = heroEntity.add(CastSkillRequestComp); request.skillIndex = 2; // 施放第2个技能 request.targetPositions = [v3(200, 0, 0)]; } // 事件触发(如复仇:受伤时施放技能) onDamaged(heroEntity: ecs.Entity) { const request = heroEntity.add(CastSkillRequestComp); request.skillIndex = 0; request.targetPositions = this.selectEnemies(); } ``` --- ### **查询技能状态** ```typescript const hero = ecs.getEntity(Hero); const skillsComp = hero.get(HeroSkillsComp); // 检查技能是否就绪 if (skillsComp.canCast(0, heroModel.mp)) { console.log("技能1可以施放!"); } // 获取所有就绪技能 const readySkills = skillsComp.getReadySkills(heroModel.mp); console.log(`可施放技能数量: ${readySkills.length}`); // 获取技能CD const skill0 = skillsComp.getSkill(0); console.log(`技能1剩余CD: ${skill0.cd.toFixed(2)}秒`); ``` --- ## 🔧 禁用自动施法 如果只想手动控制技能,注释掉自动施法系统: ```typescript protected async initEcsSystem() { oops.ecs.add(new SkillCDSystem()); // oops.ecs.add(new SkillAutocastSystem()); // ❌ 禁用自动施法 oops.ecs.add(new SkillCastSystem()); } ``` --- ## 🎯 与原系统对比 | 指标 | 旧系统(SkillConComp.update) | 新系统(HSkillSystem) | |------|------------------------------|----------------------| | **职责** | CD更新 + 施法判定 + 执行 | 3个独立系统 | | **扩展性** | 低(所有逻辑耦合) | 高(系统独立) | | **代码位置** | 分散在 View 层 | 集中在数据/业务层 | | **测试** | 难(依赖 View) | 易(独立系统) | | **手动施法** | 需额外实现 | 标记组件即可 | | **ECS 规范** | 不符合 | ✅ 完全符合 | --- ## 📊 架构图 ``` 玩家实体(Hero/Monster) ├── HeroAttrsComp(属性:hp, mp, 状态) ├── HeroSkillsComp(技能:skills[], CD管理)⭐ 新增 ├── HeroViewComp(视图:动画、UI) └── BattleMoveComp(移动) 技能系统(HSkillSystem) ├── SkillCDSystem ─────────→ HeroSkillsComp │ └─ 每帧更新CD ├── SkillAutocastSystem ───→ HeroSkillsComp + HeroAttrsComp │ └─ AI决策施法 └── SkillCastSystem ───────→ 监听 CastSkillRequestComp ├─ 检查条件 ├─ 扣除MP ├─ 重置CD └─ 创建技能实体 ``` --- ## ✅ 验证清单 运行游戏后检查: - [ ] 角色加载后拥有技能(查看 HeroSkillsComp.skills) - [ ] 技能CD自动递减(观察 skill.cd 变化) - [ ] 攻击时自动施放技能(观察技能特效) - [ ] 施放后MP减少、CD重置 - [ ] 控制状态(眩晕/冰冻)时不施放技能 --- ## 🎉 完成! **新技能系统已完全集成到项目中!** ✅ 无需修改原有战斗逻辑 ✅ 无需修改技能实体(复用 SkillEnt) ✅ 自动与战斗系统集成 ✅ 支持多种施法方式 **开始享受清晰的架构吧!** 🚀