重构了 技能系统,还需要完善
This commit is contained in:
189
assets/script/game/skill/快速开始.md
Normal file
189
assets/script/game/skill/快速开始.md
Normal 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)
|
||||
✅ 自动与战斗系统集成
|
||||
✅ 支持多种施法方式
|
||||
|
||||
**开始享受清晰的架构吧!** 🚀
|
||||
|
||||
Reference in New Issue
Block a user