Files
heros/assets/script/game/skill/快速开始.md

4.8 KiB
Raw Blame History

新技能系统 - 快速开始

🚀 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.tsMon.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
自动与战斗系统集成
支持多种施法方式

开始享受清晰的架构吧! 🚀