190 lines
4.8 KiB
Markdown
190 lines
4.8 KiB
Markdown
# 新技能系统 - 快速开始
|
||
|
||
## 🚀 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>(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)
|
||
✅ 自动与战斗系统集成
|
||
✅ 支持多种施法方式
|
||
|
||
**开始享受清晰的架构吧!** 🚀
|
||
|