feat(skill): 为技能系统添加基于时间的结束条件支持
- 在 SkillConfig 接口中新增可选的 time 字段,用于配置持续时间 - 在 Skill 实体初始化时,根据 EType.timeEnd 类型添加或移除时间组件 - 新增 StimeDataComp 组件存储技能时间数据 - 新增 STimeSystem 系统处理技能时间更新逻辑,实现定时销毁技能
This commit is contained in:
@@ -195,6 +195,7 @@ export interface SkillConfig {
|
|||||||
DAnm:number, // 命中后动画ID
|
DAnm:number, // 命中后动画ID
|
||||||
RType:RType, // 技能运行类型(直线/贝塞尔/固定起点/固定终点)
|
RType:RType, // 技能运行类型(直线/贝塞尔/固定起点/固定终点)
|
||||||
EType:EType, // 结束条件(动画结束/时间结束/距离结束/碰撞/次数结束)
|
EType:EType, // 结束条件(动画结束/时间结束/距离结束/碰撞/次数结束)
|
||||||
|
time?:number, // timeEnd 持续时间(秒)
|
||||||
kind?:SkillKind, // 主效果类型
|
kind?:SkillKind, // 主效果类型
|
||||||
buffs:number[], // 对施法者的buff配置列表(Buff UUID 列表)
|
buffs:number[], // 对施法者的buff配置列表(Buff UUID 列表)
|
||||||
debuffs:number[], // 对目标的debuff配置列表(Buff UUID 列表)
|
debuffs:number[], // 对目标的debuff配置列表(Buff UUID 列表)
|
||||||
|
|||||||
@@ -1,25 +1,43 @@
|
|||||||
import { Vec3, v3, Node } from "cc";
|
|
||||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||||
import { RType, EType, SkillSet } from "../common/config/SkillSet";
|
import { EType, SkillSet } from "../common/config/SkillSet";
|
||||||
import { BoxSet } from "../common/config/GameSet";
|
|
||||||
import { SkillView } from "./SkillView";
|
import { SkillView } from "./SkillView";
|
||||||
import { smc } from "../common/SingletonModuleComp";
|
import { smc } from "../common/SingletonModuleComp";
|
||||||
|
|
||||||
/**
|
|
||||||
* ==================== 技能移动数据组件 ====================
|
|
||||||
*
|
|
||||||
* 用途:
|
|
||||||
* - 存储技能实体的移动相关数据
|
|
||||||
* - 管理移动状态和参数
|
|
||||||
* - 支持多种移动类型(线性、贝塞尔、固定位置等)
|
|
||||||
*/
|
|
||||||
@ecs.register('StimeDataComp')
|
@ecs.register('StimeDataComp')
|
||||||
export class StimeDataComp extends ecs.Comp {
|
export class StimeDataComp extends ecs.Comp {
|
||||||
/** 技能UUID */
|
|
||||||
s_uuid: number = 0;
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { Attrs } from "../common/config/HeroAttrs";
|
|||||||
import { SkillView } from "./SkillView";
|
import { SkillView } from "./SkillView";
|
||||||
import { SDataCom } from "./SDataCom";
|
import { SDataCom } from "./SDataCom";
|
||||||
import { SMoveDataComp } from "../skill/SMoveComp";
|
import { SMoveDataComp } from "../skill/SMoveComp";
|
||||||
|
import { StimeDataComp } from "./STimeComp";
|
||||||
import { HeroViewComp } from "../hero/HeroViewComp";
|
import { HeroViewComp } from "../hero/HeroViewComp";
|
||||||
import { smc } from "../common/SingletonModuleComp";
|
import { smc } from "../common/SingletonModuleComp";
|
||||||
import { mLogger } from "../common/Logger";
|
import { mLogger } from "../common/Logger";
|
||||||
@@ -143,6 +144,17 @@ export class Skill extends ecs.Entity {
|
|||||||
// 从SkillView获取移动参数,位置初始化由SMoveSystem统一处理
|
// 从SkillView获取移动参数,位置初始化由SMoveSystem统一处理
|
||||||
sMoveCom.atk_x = SView.atk_x;
|
sMoveCom.atk_x = SView.atk_x;
|
||||||
sMoveCom.atk_y = SView.atk_y;
|
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)
|
let cAttrsComp=caster.ent.get(HeroAttrsComp)
|
||||||
// 初始化数据组件
|
// 初始化数据组件
|
||||||
@@ -177,6 +189,7 @@ export class Skill extends ecs.Entity {
|
|||||||
// 注: 自定义释放逻辑,视图层实现 ecs.IComp 接口的 ecs 组件需要手动释放
|
// 注: 自定义释放逻辑,视图层实现 ecs.IComp 接口的 ecs 组件需要手动释放
|
||||||
this.remove(SDataCom);
|
this.remove(SDataCom);
|
||||||
this.remove(SMoveDataComp)
|
this.remove(SMoveDataComp)
|
||||||
|
this.remove(StimeDataComp)
|
||||||
|
|
||||||
// 移除组件会触发 reset,但我们在 reset 中移除了 destroy
|
// 移除组件会触发 reset,但我们在 reset 中移除了 destroy
|
||||||
this.remove(SkillView)
|
this.remove(SkillView)
|
||||||
|
|||||||
Reference in New Issue
Block a user