From 518591468c2143975adf90f6c53f66b1ce44cfc4 Mon Sep 17 00:00:00 2001 From: walkpan Date: Sun, 15 Mar 2026 23:11:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(skill):=20=E4=B8=BA=E6=8A=80=E8=83=BD?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B7=BB=E5=8A=A0=E5=9F=BA=E4=BA=8E=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=9A=84=E7=BB=93=E6=9D=9F=E6=9D=A1=E4=BB=B6=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 SkillConfig 接口中新增可选的 time 字段,用于配置持续时间 - 在 Skill 实体初始化时,根据 EType.timeEnd 类型添加或移除时间组件 - 新增 StimeDataComp 组件存储技能时间数据 - 新增 STimeSystem 系统处理技能时间更新逻辑,实现定时销毁技能 --- assets/script/game/common/config/SkillSet.ts | 1 + assets/script/game/skill/STimeComp.ts | 50 +++++++++++++------- assets/script/game/skill/Skill.ts | 13 +++++ 3 files changed, 48 insertions(+), 16 deletions(-) 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)