Files
pixelheros/assets/script/game/skill/快速开始.md
2025-10-30 15:12:49 +08:00

190 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 新技能系统 - 快速开始
## 🚀 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
✅ 自动与战斗系统集成
✅ 支持多种施法方式
**开始享受清晰的架构吧!** 🚀