重构了 技能系统,还需要完善

This commit is contained in:
panw
2025-10-30 15:12:49 +08:00
parent 1281cbd32d
commit 55646c3a11
27 changed files with 1022 additions and 595 deletions

View File

@@ -0,0 +1,189 @@
# 新技能系统 - 快速开始
## 🚀 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
✅ 自动与战斗系统集成
✅ 支持多种施法方式
**开始享受清晰的架构吧!** 🚀