diff --git a/assets/script/game/common/config/SkillSet.ts b/assets/script/game/common/config/SkillSet.ts index f8a136fe..e2ef46e6 100644 --- a/assets/script/game/common/config/SkillSet.ts +++ b/assets/script/game/common/config/SkillSet.ts @@ -195,6 +195,7 @@ export interface SkillConfig { DAnm:number, // 命中后动画ID RType:RType, // 技能运行类型(直线/贝塞尔/固定起点/固定终点) EType:EType, // 结束条件(动画结束/时间结束/距离结束/碰撞/次数结束) + time?:number, // timeEnd 持续时间(秒) kind?:SkillKind, // 主效果类型 buffs:number[], // 对施法者的buff配置列表(Buff UUID 列表) debuffs:number[], // 对目标的debuff配置列表(Buff UUID 列表) diff --git a/assets/script/game/skill/STimeComp.ts b/assets/script/game/skill/STimeComp.ts index 71c49183..8a00f535 100644 --- a/assets/script/game/skill/STimeComp.ts +++ b/assets/script/game/skill/STimeComp.ts @@ -1,25 +1,43 @@ -import { Vec3, v3, Node } from "cc"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; -import { RType, EType, SkillSet } from "../common/config/SkillSet"; -import { BoxSet } from "../common/config/GameSet"; +import { EType, SkillSet } from "../common/config/SkillSet"; import { SkillView } from "./SkillView"; import { smc } from "../common/SingletonModuleComp"; - -/** - * ==================== 技能移动数据组件 ==================== - * - * 用途: - * - 存储技能实体的移动相关数据 - * - 管理移动状态和参数 - * - 支持多种移动类型(线性、贝塞尔、固定位置等) - */ @ecs.register('StimeDataComp') export class StimeDataComp extends ecs.Comp { - /** 技能UUID */ s_uuid: number = 0; - reset() { - - } + totalTime: number = 0; + elapsedTime: number = 0; + reset() { + this.s_uuid = 0; + this.totalTime = 0; + this.elapsedTime = 0; + } } +@ecs.register('STimeSystem') +export class STimeSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate { + filter(): ecs.IMatcher { + return ecs.allOf(StimeDataComp, SkillView); + } + + update(entity: ecs.Entity): void { + if(!smc.mission.play ) return; + if(smc.mission.pause) return + const timeComp = entity.get(StimeDataComp); + const skillView = entity.get(SkillView); + if (!timeComp || !skillView) return; + const conf = SkillSet[timeComp.s_uuid]; + if (!conf || conf.EType !== EType.timeEnd) return; + if (timeComp.totalTime <= 0) { + skillView.close_collider(); + entity.destroy(); + return; + } + timeComp.elapsedTime += this.dt; + if (timeComp.elapsedTime >= timeComp.totalTime) { + skillView.close_collider(); + entity.destroy(); + } + } +} diff --git a/assets/script/game/skill/Skill.ts b/assets/script/game/skill/Skill.ts index bc511e0a..ecc91009 100644 --- a/assets/script/game/skill/Skill.ts +++ b/assets/script/game/skill/Skill.ts @@ -8,6 +8,7 @@ import { Attrs } from "../common/config/HeroAttrs"; import { SkillView } from "./SkillView"; import { SDataCom } from "./SDataCom"; import { SMoveDataComp } from "../skill/SMoveComp"; +import { StimeDataComp } from "./STimeComp"; import { HeroViewComp } from "../hero/HeroViewComp"; import { smc } from "../common/SingletonModuleComp"; import { mLogger } from "../common/Logger"; @@ -143,6 +144,17 @@ export class Skill extends ecs.Entity { // 从SkillView获取移动参数,位置初始化由SMoveSystem统一处理 sMoveCom.atk_x = SView.atk_x; sMoveCom.atk_y = SView.atk_y; + + if (config.EType === EType.timeEnd) { + let sTimeCom = this.get(StimeDataComp); + if (!sTimeCom) sTimeCom = this.add(StimeDataComp); + sTimeCom.reset(); + sTimeCom.s_uuid = s_uuid; + sTimeCom.totalTime = Math.max(0, config.time ?? 0); + } else { + const sTimeCom = this.get(StimeDataComp); + if (sTimeCom) this.remove(StimeDataComp); + } let cAttrsComp=caster.ent.get(HeroAttrsComp) // 初始化数据组件 @@ -177,6 +189,7 @@ export class Skill extends ecs.Entity { // 注: 自定义释放逻辑,视图层实现 ecs.IComp 接口的 ecs 组件需要手动释放 this.remove(SDataCom); this.remove(SMoveDataComp) + this.remove(StimeDataComp) // 移除组件会触发 reset,但我们在 reset 中移除了 destroy this.remove(SkillView)