4.8 KiB
4.8 KiB
新技能系统 - 快速开始
🚀 3步开始使用
步骤 1:注册系统到 Main.ts
// 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
✅ 加载角色时自动初始化技能
✅ 无需手动配置
// Hero.ts - load() 方法已自动处理
skillsComp.initSkills(hero.skills); // ✅ 已完成
步骤 3:技能自动施放!
无需额外代码,系统会自动处理:
// 每帧自动运行:
// 1. SkillCDSystem 更新CD
// 2. SkillAutocastSystem 检测可施放技能
// ├─ CD好了? ✅
// ├─ MP够? ✅
// ├─ 正在攻击? ✅
// └─ 添加 CastSkillRequestComp 标记
// 3. SkillCastSystem 执行施法
// ├─ 检查条件
// ├─ 扣除MP
// ├─ 重置CD
// ├─ 播放动画
// └─ 创建技能实体
🎮 进阶使用
手动施法(玩家点击技能按钮)
// UI 按钮点击事件
onSkillButton1Clicked() {
const skillCon = this.heroNode.getComponent(SkillConComp);
skillCon.manualCastSkill(0); // 施放第0个技能
}
onSkillButton2Clicked() {
const skillCon = this.heroNode.getComponent(SkillConComp);
skillCon.manualCastSkill(1); // 施放第1个技能
}
强制施法(天赋触发、事件触发)
// 天赋系统
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();
}
查询技能状态
const hero = ecs.getEntity<Hero>(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)}秒`);
🔧 禁用自动施法
如果只想手动控制技能,注释掉自动施法系统:
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)
✅ 自动与战斗系统集成
✅ 支持多种施法方式
开始享受清晰的架构吧! 🚀