refactor(skill): 重构技能组件目录结构并重命名施法请求组件

将技能相关组件从hero目录移动到skill目录
将CastSkillRequestComp重命名为CSRequestComp
更新相关引用和文档说明
This commit is contained in:
2025-10-31 09:22:50 +08:00
parent a1c605238d
commit b38e63e200
14 changed files with 47 additions and 129 deletions

View File

@@ -18,7 +18,7 @@
## 更新摘要 ## 更新摘要
**已做更改** **已做更改**
- 更新了组件注册机制部分以反映在多个系统中添加ECS注册装饰器的更改 - 更新了组件注册机制部分以反映在多个系统中添加ECS注册装饰器的更改
- 添加了关于技能系统的新部分包括CastSkillRequestComp、SkillCastSystem、SkillCDSystem和SkillAutocastSystem - 添加了关于技能系统的新部分包括CSRequestComp、SkillCastSystem、SkillCDSystem和SkillAutocastSystem
- 更新了实际案例分析,以包含新的技能系统实现 - 更新了实际案例分析,以包含新的技能系统实现
- 在扩展开发指南中添加了新的系统接口示例 - 在扩展开发指南中添加了新的系统接口示例
- 更新了文档来源以包含新分析的文件 - 更新了文档来源以包含新分析的文件
@@ -355,7 +355,7 @@ HeroViewComp实现了复杂的BUFF/DEBUFF管理系统
```mermaid ```mermaid
classDiagram classDiagram
class CastSkillRequestComp { class CSRequestComp {
+number skillIndex +number skillIndex
+Vec3[] targetPositions +Vec3[] targetPositions
+reset() void +reset() void
@@ -424,14 +424,14 @@ participant Cast as SkillCastSystem
participant Entity as Entity participant Entity as Entity
participant Skill as SkillEnt participant Skill as SkillEnt
Auto->>Entity : update() Auto->>Entity : update()
Auto->>Entity : add(CastSkillRequestComp) Auto->>Entity : add(CSRequestComp)
Cast->>Entity : entityEnter() Cast->>Entity : entityEnter()
Cast->>Entity : checkCastConditions() Cast->>Entity : checkCastConditions()
Cast->>Entity : executeCast() Cast->>Entity : executeCast()
Cast->>Entity : playSkillEffect() Cast->>Entity : playSkillEffect()
Cast->>Cast : createSkillEntity() Cast->>Cast : createSkillEntity()
Cast->>Skill : load() Cast->>Skill : load()
Cast->>Entity : remove(CastSkillRequestComp) Cast->>Entity : remove(CSRequestComp)
``` ```
**图表来源** **图表来源**
@@ -447,7 +447,7 @@ Cast->>Entity : remove(CastSkillRequestComp)
- `SkillCDSystem`:负责管理"技能冷却" - `SkillCDSystem`:负责管理"技能冷却"
2. **标记驱动设计** 2. **标记驱动设计**
- 使用`CastSkillRequestComp`作为标记组件 - 使用`CSRequestComp`作为标记组件
- 避免了直接调用系统方法的耦合 - 避免了直接调用系统方法的耦合
- 符合ECS的声明式编程理念 - 符合ECS的声明式编程理念

View File

@@ -239,7 +239,7 @@ SkillConfig --> BuffConf
```mermaid ```mermaid
classDiagram classDiagram
class CastSkillRequestComp { class CSRequestComp {
+skillIndex : number +skillIndex : number
+targetPositions : Vec3[] +targetPositions : Vec3[]
+reset() void +reset() void
@@ -261,9 +261,9 @@ class SkillAutocastSystem {
+update(e : Entity) void +update(e : Entity) void
+selectTargets() Vec3[] +selectTargets() Vec3[]
} }
CastSkillRequestComp --> SkillCastSystem CSRequestComp --> SkillCastSystem
SkillCastSystem --> SkillCDSystem SkillCastSystem --> SkillCDSystem
SkillAutocastSystem --> CastSkillRequestComp SkillAutocastSystem --> CSRequestComp
``` ```
**章节来源** **章节来源**

View File

@@ -0,0 +1,12 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "d2d775f5-1dc0-455e-89d7-4a17f43170e0",
"files": [],
"subMetas": {},
"userData": {
"compressionType": {},
"isRemoteBundle": {}
}
}

View File

@@ -1,10 +1,10 @@
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { Vec3, v3 } from "cc"; import { Vec3, v3 } from "cc";
import { CastSkillRequestComp } from "./STagComps";
import { HeroAttrsComp } from "./HeroAttrsComp"; import { HeroAttrsComp } from "./HeroAttrsComp";
import { HeroViewComp } from "./HeroViewComp"; import { HeroViewComp } from "./HeroViewComp";
import { SkillSet, SType } from "../common/config/SkillSet"; import { SkillSet, SType } from "../common/config/SkillSet";
import { HeroSkillsComp } from "./HeroSkills"; import { HeroSkillsComp } from "./HeroSkills";
import { CSRequestComp } from "../skill/STagComps";
/** /**
* ==================== 自动施法系统 ==================== * ==================== 自动施法系统 ====================
@@ -17,7 +17,7 @@ import { HeroSkillsComp } from "./HeroSkills";
* *
* 设计理念: * 设计理念:
* - 负责"何时施法"的决策 * - 负责"何时施法"的决策
* - 通过添加 CastSkillRequestComp 触发施法 * - 通过添加 CSRequestComp 触发施法
* - 可被玩家输入系统或AI系统复用 * - 可被玩家输入系统或AI系统复用
* - 支持多种AI策略 * - 支持多种AI策略
*/ */
@@ -53,7 +53,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
if (!config || config.SType !== SType.damage) continue; if (!config || config.SType !== SType.damage) continue;
// ✅ 添加施法请求标记组件 // ✅ 添加施法请求标记组件
const request = e.add(CastSkillRequestComp) as CastSkillRequestComp; const request = e.add(CSRequestComp) as CSRequestComp;
request.skillIndex = skillIndex; request.skillIndex = skillIndex;
request.targets = this.sTargets(heroView); request.targets = this.sTargets(heroView);

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "e76866cc-7379-436f-91ff-e71e790580a9",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -1,18 +1,18 @@
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { Vec3, v3 } from "cc"; import { Vec3, v3 } from "cc";
import { CastSkillRequestComp } from "./STagComps";
import { HeroAttrsComp } from "./HeroAttrsComp"; import { HeroAttrsComp } from "./HeroAttrsComp";
import { HeroViewComp } from "./HeroViewComp"; import { HeroViewComp } from "./HeroViewComp";
import { SkillSet, SType } from "../common/config/SkillSet"; import { SkillSet, SType } from "../common/config/SkillSet";
import { SkillEnt } from "../skill/SkillEnt"; import { SkillEnt } from "../skill/SkillEnt";
import { HeroSkillsComp } from "./HeroSkills"; import { HeroSkillsComp } from "./HeroSkills";
import { Skill } from "../skill/Skill"; import { Skill } from "../skill/Skill";
import { CSRequestComp } from "../skill/STagComps";
/** /**
* ==================== 技能施法系统 手动施法==================== * ==================== 技能施法系统 手动施法====================
* *
* 职责: * 职责:
* 1. 监听 CastSkillRequestComp 标记组件 * 1. 监听 CSRequestComp 标记组件
* 2. 检查施法条件CD、MP、状态 * 2. 检查施法条件CD、MP、状态
* 3. 扣除资源MP * 3. 扣除资源MP
* 4. 创建技能实体 * 4. 创建技能实体
@@ -31,7 +31,7 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn
* 过滤器:拥有技能数据 + 施法请求的实体 * 过滤器:拥有技能数据 + 施法请求的实体
*/ */
filter(): ecs.IMatcher { filter(): ecs.IMatcher {
return ecs.allOf(HeroSkillsComp, HeroAttrsComp, CastSkillRequestComp); return ecs.allOf(HeroSkillsComp, HeroAttrsComp, CSRequestComp);
} }
/** /**
@@ -40,13 +40,13 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn
entityEnter(e: ecs.Entity): void { entityEnter(e: ecs.Entity): void {
const skills = e.get(HeroSkillsComp); const skills = e.get(HeroSkillsComp);
const heroModel = e.get(HeroAttrsComp); const heroModel = e.get(HeroAttrsComp);
const request = e.get(CastSkillRequestComp); const request = e.get(CSRequestComp);
const heroView = e.get(HeroViewComp); const heroView = e.get(HeroViewComp);
// 1. 验证数据完整性 // 1. 验证数据完整性
if (!skills || !heroModel || !request || !heroView) { if (!skills || !heroModel || !request || !heroView) {
console.warn("[SkillCastSystem] 数据不完整,取消施法"); console.warn("[SkillCastSystem] 数据不完整,取消施法");
e.remove(CastSkillRequestComp); e.remove(CSRequestComp);
return; return;
} }
@@ -54,13 +54,13 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn
const skill = skills.getSkill(request.skillIndex); const skill = skills.getSkill(request.skillIndex);
if (!skill) { if (!skill) {
console.warn(`[SkillCastSystem] 技能索引无效: ${request.skillIndex}`); console.warn(`[SkillCastSystem] 技能索引无效: ${request.skillIndex}`);
e.remove(CastSkillRequestComp); e.remove(CSRequestComp);
return; return;
} }
// 3. 检查施法条件 // 3. 检查施法条件
if (!this.checkCastConditions(skills, heroModel, request.skillIndex)) { if (!this.checkCastConditions(skills, heroModel, request.skillIndex)) {
e.remove(CastSkillRequestComp); e.remove(CSRequestComp);
return; return;
} }
@@ -72,7 +72,7 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn
skills.resetCD(request.skillIndex); skills.resetCD(request.skillIndex);
// 6. 移除请求标记 // 6. 移除请求标记
e.remove(CastSkillRequestComp); e.remove(CSRequestComp);
} }
/** /**

View File

@@ -1,106 +0,0 @@
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { Vec3 } from "cc";
/**
* ==================== 技能数据组件 ====================
*
* 用途:
* - 存储单个技能的完整数据
* - 包含技能配置、状态、目标等信息
* - 可被技能系统读取和修改
*/
@ecs.register('SkillData')
export class SkillDataComp extends ecs.Comp {
/** 技能唯一ID */
skillId: number = 0;
/** 技能名称 */
name: string = "";
/** 技能等级 */
level: number = 1;
/** 技能类型 */
type: number = 0;
/** 消耗MP */
cost: number = 0;
/** 冷却时间 */
cooldown: number = 0;
/** 当前冷却剩余时间 */
currentCooldown: number = 0;
/** 伤害值 */
damage: number = 0;
/** 技能范围 */
range: number = 0;
/** 施法时间 */
castTime: number = 0;
/** 技能描述 */
description: string = "";
/** 是否已解锁 */
unlocked: boolean = false;
/** 技能图标路径 */
iconPath: string = "";
/** 额外属性数据 */
extraData: any = null;
reset() {
this.skillId = 0;
this.name = "";
this.level = 1;
this.type = 0;
this.cost = 0;
this.cooldown = 0;
this.currentCooldown = 0;
this.damage = 0;
this.range = 0;
this.castTime = 0;
this.description = "";
this.unlocked = false;
this.iconPath = "";
this.extraData = null;
}
/**
* 检查技能是否可以施放
*/
canCast(currentMP: number): boolean {
return this.unlocked &&
this.currentCooldown <= 0 &&
currentMP >= this.cost;
}
/**
* 更新冷却时间
*/
updateCooldown(deltaTime: number): void {
if (this.currentCooldown > 0) {
this.currentCooldown = Math.max(0, this.currentCooldown - deltaTime);
}
}
/**
* 重置冷却时间
*/
resetCooldown(): void {
this.currentCooldown = this.cooldown;
}
/**
* 获取冷却进度 (0-1)
*/
getCooldownProgress(): number {
if (this.cooldown <= 0) return 1;
return Math.max(0, 1 - (this.currentCooldown / this.cooldown));
}
}

View File

@@ -1,17 +1,20 @@
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { BoxSet } from "../common/config/BoxSet"; import { BoxSet } from "../common/config/BoxSet";
import { HeroViewComp } from "../hero/HeroViewComp";
/** 业务层对象 */ /** 业务层对象 */
@ecs.register('SDataCom') @ecs.register('SDataCom')
export class SDataCom extends ecs.Comp { export class SDataCom extends ecs.Comp {
/** 业务层组件移除时,重置所有数据为默认值 */ /** 业务层组件移除时,重置所有数据为默认值 */
attrs:any=null attrs:any=null
caster:HeroViewComp=null
group:BoxSet=BoxSet.HERO group:BoxSet=BoxSet.HERO
s_uuid:number=0 s_uuid:number=0
reset() { reset() {
this.attrs=null this.attrs=null
this.group=0 this.group=0
this.s_uuid=0 this.s_uuid=0
this.caster=null
} }
} }

View File

@@ -9,8 +9,8 @@ import { Vec3 } from "cc";
* - AI系统 * - AI系统
* - * -
*/ */
@ecs.register('CastSkillRequest') @ecs.register('CSRequest')
export class CastSkillRequestComp extends ecs.Comp { export class CSRequestComp extends ecs.Comp {
/** 技能索引(在 HeroSkillsComp.skills 中的位置) */ /** 技能索引(在 HeroSkillsComp.skills 中的位置) */
skillIndex: number = 0; skillIndex: number = 0;

View File

@@ -12,7 +12,7 @@ import { HType } from "../common/config/heroSet";
import { SkillView } from "./SkillView"; import { SkillView } from "./SkillView";
import { SDataCom } from "./SDataCom"; import { SDataCom } from "./SDataCom";
import { Attrs } from "../common/config/HeroAttrs"; import { Attrs } from "../common/config/HeroAttrs";
import { SMoveDataComp } from "../hero/SMoveComp"; import { SMoveDataComp } from "../skill/SMoveComp";
/** Skill 模块 */ /** Skill 模块 */
@ecs.register(`Skill`) @ecs.register(`Skill`)

View File

@@ -6,7 +6,7 @@ import { DTType, RType, SkillSet } from "../common/config/SkillSet";
import { BezierMove } from "../BezierMove/BezierMove"; import { BezierMove } from "../BezierMove/BezierMove";
import { BoxSet } from "../common/config/BoxSet"; import { BoxSet } from "../common/config/BoxSet";
import { SDataCom } from "./SDataCom"; import { SDataCom } from "./SDataCom";
import { SMoveDataComp } from "../hero/SMoveComp"; import { SMoveDataComp } from "./SMoveComp";
const { ccclass, property } = _decorator; const { ccclass, property } = _decorator;