diff --git a/.qoder/repowiki/zh/content/技术架构/ECS架构.md b/.qoder/repowiki/zh/content/技术架构/ECS架构.md index 72387a2b..a1d4e8ae 100644 --- a/.qoder/repowiki/zh/content/技术架构/ECS架构.md +++ b/.qoder/repowiki/zh/content/技术架构/ECS架构.md @@ -18,7 +18,7 @@ ## 更新摘要 **已做更改** - 更新了组件注册机制部分,以反映在多个系统中添加ECS注册装饰器的更改 -- 添加了关于技能系统的新部分,包括CastSkillRequestComp、SkillCastSystem、SkillCDSystem和SkillAutocastSystem +- 添加了关于技能系统的新部分,包括CSRequestComp、SkillCastSystem、SkillCDSystem和SkillAutocastSystem - 更新了实际案例分析,以包含新的技能系统实现 - 在扩展开发指南中添加了新的系统接口示例 - 更新了文档来源以包含新分析的文件 @@ -355,7 +355,7 @@ HeroViewComp实现了复杂的BUFF/DEBUFF管理系统: ```mermaid classDiagram -class CastSkillRequestComp { +class CSRequestComp { +number skillIndex +Vec3[] targetPositions +reset() void @@ -424,14 +424,14 @@ participant Cast as SkillCastSystem participant Entity as Entity participant Skill as SkillEnt Auto->>Entity : update() -Auto->>Entity : add(CastSkillRequestComp) +Auto->>Entity : add(CSRequestComp) Cast->>Entity : entityEnter() Cast->>Entity : checkCastConditions() Cast->>Entity : executeCast() Cast->>Entity : playSkillEffect() Cast->>Cast : createSkillEntity() Cast->>Skill : load() -Cast->>Entity : remove(CastSkillRequestComp) +Cast->>Entity : remove(CSRequestComp) ``` **图表来源** @@ -447,7 +447,7 @@ Cast->>Entity : remove(CastSkillRequestComp) - `SkillCDSystem`:负责管理"技能冷却" 2. **标记驱动设计**: - - 使用`CastSkillRequestComp`作为标记组件 + - 使用`CSRequestComp`作为标记组件 - 避免了直接调用系统方法的耦合 - 符合ECS的声明式编程理念 diff --git a/.qoder/repowiki/zh/content/英雄系统/英雄系统.md b/.qoder/repowiki/zh/content/英雄系统/英雄系统.md index a468e6ca..9fc26c42 100644 --- a/.qoder/repowiki/zh/content/英雄系统/英雄系统.md +++ b/.qoder/repowiki/zh/content/英雄系统/英雄系统.md @@ -239,7 +239,7 @@ SkillConfig --> BuffConf ```mermaid classDiagram -class CastSkillRequestComp { +class CSRequestComp { +skillIndex : number +targetPositions : Vec3[] +reset() void @@ -261,9 +261,9 @@ class SkillAutocastSystem { +update(e : Entity) void +selectTargets() Vec3[] } -CastSkillRequestComp --> SkillCastSystem +CSRequestComp --> SkillCastSystem SkillCastSystem --> SkillCDSystem -SkillAutocastSystem --> CastSkillRequestComp +SkillAutocastSystem --> CSRequestComp ``` **章节来源** diff --git a/assets/script/game/common/ecs/position.meta b/assets/script/game/common/ecs/position.meta new file mode 100644 index 00000000..4a744f38 --- /dev/null +++ b/assets/script/game/common/ecs/position.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "d2d775f5-1dc0-455e-89d7-4a17f43170e0", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/assets/script/game/hero/SACastSystem.ts b/assets/script/game/hero/SACastSystem.ts index dcb2c4a7..6e6e2964 100644 --- a/assets/script/game/hero/SACastSystem.ts +++ b/assets/script/game/hero/SACastSystem.ts @@ -1,10 +1,10 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { Vec3, v3 } from "cc"; -import { CastSkillRequestComp } from "./STagComps"; import { HeroAttrsComp } from "./HeroAttrsComp"; import { HeroViewComp } from "./HeroViewComp"; import { SkillSet, SType } from "../common/config/SkillSet"; import { HeroSkillsComp } from "./HeroSkills"; +import { CSRequestComp } from "../skill/STagComps"; /** * ==================== 自动施法系统 ==================== @@ -17,7 +17,7 @@ import { HeroSkillsComp } from "./HeroSkills"; * * 设计理念: * - 负责"何时施法"的决策 - * - 通过添加 CastSkillRequestComp 触发施法 + * - 通过添加 CSRequestComp 触发施法 * - 可被玩家输入系统或AI系统复用 * - 支持多种AI策略 */ @@ -53,7 +53,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat 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.targets = this.sTargets(heroView); diff --git a/assets/script/game/hero/SACastSystem.ts.meta b/assets/script/game/hero/SACastSystem.ts.meta new file mode 100644 index 00000000..9fd88241 --- /dev/null +++ b/assets/script/game/hero/SACastSystem.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "e76866cc-7379-436f-91ff-e71e790580a9", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/assets/script/game/hero/SCastSystem.ts b/assets/script/game/hero/SCastSystem.ts index 669097dc..d4929649 100644 --- a/assets/script/game/hero/SCastSystem.ts +++ b/assets/script/game/hero/SCastSystem.ts @@ -1,18 +1,18 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { Vec3, v3 } from "cc"; -import { CastSkillRequestComp } from "./STagComps"; import { HeroAttrsComp } from "./HeroAttrsComp"; import { HeroViewComp } from "./HeroViewComp"; import { SkillSet, SType } from "../common/config/SkillSet"; import { SkillEnt } from "../skill/SkillEnt"; import { HeroSkillsComp } from "./HeroSkills"; import { Skill } from "../skill/Skill"; +import { CSRequestComp } from "../skill/STagComps"; /** * ==================== 技能施法系统 手动施法==================== * * 职责: - * 1. 监听 CastSkillRequestComp 标记组件 + * 1. 监听 CSRequestComp 标记组件 * 2. 检查施法条件(CD、MP、状态) * 3. 扣除资源(MP) * 4. 创建技能实体 @@ -31,7 +31,7 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn * 过滤器:拥有技能数据 + 施法请求的实体 */ 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 { const skills = e.get(HeroSkillsComp); const heroModel = e.get(HeroAttrsComp); - const request = e.get(CastSkillRequestComp); + const request = e.get(CSRequestComp); const heroView = e.get(HeroViewComp); // 1. 验证数据完整性 if (!skills || !heroModel || !request || !heroView) { console.warn("[SkillCastSystem] 数据不完整,取消施法"); - e.remove(CastSkillRequestComp); + e.remove(CSRequestComp); return; } @@ -54,13 +54,13 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn const skill = skills.getSkill(request.skillIndex); if (!skill) { console.warn(`[SkillCastSystem] 技能索引无效: ${request.skillIndex}`); - e.remove(CastSkillRequestComp); + e.remove(CSRequestComp); return; } // 3. 检查施法条件 if (!this.checkCastConditions(skills, heroModel, request.skillIndex)) { - e.remove(CastSkillRequestComp); + e.remove(CSRequestComp); return; } @@ -72,7 +72,7 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn skills.resetCD(request.skillIndex); // 6. 移除请求标记 - e.remove(CastSkillRequestComp); + e.remove(CSRequestComp); } /** diff --git a/assets/script/game/hero/SDataComp.ts b/assets/script/game/hero/SDataComp.ts deleted file mode 100644 index 4afe7af5..00000000 --- a/assets/script/game/hero/SDataComp.ts +++ /dev/null @@ -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)); - } -} - diff --git a/assets/script/game/skill/SDataCom.ts b/assets/script/game/skill/SDataCom.ts index 00ffac89..37b21f22 100644 --- a/assets/script/game/skill/SDataCom.ts +++ b/assets/script/game/skill/SDataCom.ts @@ -1,17 +1,20 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { BoxSet } from "../common/config/BoxSet"; +import { HeroViewComp } from "../hero/HeroViewComp"; /** 业务层对象 */ @ecs.register('SDataCom') export class SDataCom extends ecs.Comp { /** 业务层组件移除时,重置所有数据为默认值 */ attrs:any=null + caster:HeroViewComp=null group:BoxSet=BoxSet.HERO s_uuid:number=0 reset() { this.attrs=null this.group=0 this.s_uuid=0 + this.caster=null } } diff --git a/assets/script/game/hero/SMoveComp.ts b/assets/script/game/skill/SMoveComp.ts similarity index 100% rename from assets/script/game/hero/SMoveComp.ts rename to assets/script/game/skill/SMoveComp.ts diff --git a/assets/script/game/hero/SMoveComp.ts.meta b/assets/script/game/skill/SMoveComp.ts.meta similarity index 100% rename from assets/script/game/hero/SMoveComp.ts.meta rename to assets/script/game/skill/SMoveComp.ts.meta diff --git a/assets/script/game/hero/STagComps.ts b/assets/script/game/skill/STagComps.ts similarity index 93% rename from assets/script/game/hero/STagComps.ts rename to assets/script/game/skill/STagComps.ts index 29fd7953..c6da1cc8 100644 --- a/assets/script/game/hero/STagComps.ts +++ b/assets/script/game/skill/STagComps.ts @@ -9,8 +9,8 @@ import { Vec3 } from "cc"; * - 由外部(如AI系统、玩家输入)添加 * - 施法系统处理后自动移除 */ -@ecs.register('CastSkillRequest') -export class CastSkillRequestComp extends ecs.Comp { +@ecs.register('CSRequest') +export class CSRequestComp extends ecs.Comp { /** 技能索引(在 HeroSkillsComp.skills 中的位置) */ skillIndex: number = 0; diff --git a/assets/script/game/hero/STagComps.ts.meta b/assets/script/game/skill/STagComps.ts.meta similarity index 100% rename from assets/script/game/hero/STagComps.ts.meta rename to assets/script/game/skill/STagComps.ts.meta diff --git a/assets/script/game/skill/Skill.ts b/assets/script/game/skill/Skill.ts index 94dff141..14f19812 100644 --- a/assets/script/game/skill/Skill.ts +++ b/assets/script/game/skill/Skill.ts @@ -12,7 +12,7 @@ import { HType } from "../common/config/heroSet"; import { SkillView } from "./SkillView"; import { SDataCom } from "./SDataCom"; import { Attrs } from "../common/config/HeroAttrs"; -import { SMoveDataComp } from "../hero/SMoveComp"; +import { SMoveDataComp } from "../skill/SMoveComp"; /** Skill 模块 */ @ecs.register(`Skill`) diff --git a/assets/script/game/skill/SkillView.ts b/assets/script/game/skill/SkillView.ts index ba497a96..b3e3b0d0 100644 --- a/assets/script/game/skill/SkillView.ts +++ b/assets/script/game/skill/SkillView.ts @@ -6,7 +6,7 @@ import { DTType, RType, SkillSet } from "../common/config/SkillSet"; import { BezierMove } from "../BezierMove/BezierMove"; import { BoxSet } from "../common/config/BoxSet"; import { SDataCom } from "./SDataCom"; -import { SMoveDataComp } from "../hero/SMoveComp"; +import { SMoveDataComp } from "./SMoveComp"; const { ccclass, property } = _decorator;