import { BoxCollider2D, instantiate, Node, Prefab, v3, Vec3 } from "cc"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { EType, SkillSet } from "../common/config/SkillSet"; import { oops } from "db://oops-framework/core/Oops"; import { HeroAttrsComp } from "../hero/HeroAttrsComp"; import { SkillView } from "./SkillView"; import { SDataCom } from "./SDataCom"; import { SMoveDataComp } from "../skill/SMoveComp"; import { HeroViewComp } from "../hero/HeroViewComp"; import { smc } from "../common/SingletonModuleComp"; /** Skill 模块 */ @ecs.register(`Skill`) export class Skill extends ecs.Entity { /** ---------- 数据层 ---------- */ SDataCom!: SDataCom; SMoveCom!: SMoveDataComp /** ---------- 业务层 ---------- */ // SkillBll!: SkillBllComp; /** ---------- 视图层 ---------- */ SView!: SkillView; /** 实始添加的数据层组件 */ protected init() { this.addComponents(SDataCom); this.addComponents(SMoveDataComp); } load(startPos: Vec3, parent: Node, s_uuid: number, targetPos: Vec3, caster:HeroViewComp,ext_dmg:number=0) { const config = SkillSet[s_uuid]; if (!config) { console.error("[Skill] 技能配置不存在:", s_uuid); return; } // 加载预制体 const path = `game/skill/atk/${config.sp_name}`; const prefab:Prefab = oops.res.get(path, Prefab); if (!prefab) { console.error("[Skill] 预制体加载失败:", path); return; } // console.log("load skill startPos",startPos) const node: Node = instantiate(prefab); // console.log("load skill node",node) var scene = smc.map.MapView.scene; node.parent = scene.entityLayer!.node!.getChildByName("SKILL")!; // 设置节点属性 let face=caster.node.scale.x < 0 ? -1 : 1 node.setScale(v3(node.scale.x*face,node.scale.y,1)) // 初始视图 const SView = node.getComponent(SkillView); if(config.EType!=EType.collision){ const collider=node.getComponent(BoxCollider2D); if(collider){ collider.enabled=false } } // 只设置必要的运行时属性,配置信息通过 SkillSet[uuid] 访问 // 核心标识 SView.s_uuid= s_uuid SView.group= caster.box_group this.add(SView); startPos.x=startPos.x+SView.atk_x*face startPos.y=startPos.y+SView.atk_y node.setPosition(startPos); // 初始化移动组件 - 从SkillView获取移动参数 const sMoveCom = this.get(SMoveDataComp); sMoveCom.startPos.set(startPos); sMoveCom.targetPos.set(targetPos); sMoveCom.s_uuid = s_uuid; sMoveCom.scale = caster.node.scale.x < 0 ? -1 : 1; sMoveCom.runType = config.RType; sMoveCom.endType = config.EType; // 从SkillView获取移动参数,位置初始化由SMoveSystem统一处理 sMoveCom.atk_x = SView.atk_x; sMoveCom.atk_y = SView.atk_y; let cAttrsComp=caster.ent.get(HeroAttrsComp) // 初始化数据组件 const sDataCom = this.get(SDataCom); sDataCom.group=caster.box_group sDataCom.caster=caster sDataCom.Attrs={...cAttrsComp.Attrs} sDataCom.s_uuid=s_uuid sDataCom.fac=cAttrsComp.fac } /** 模块资源释放 */ destroy() { // 注: 自定义释放逻辑,视图层实现 ecs.IComp 接口的 ecs 组件需要手动释放 this.remove(SDataCom); this.remove(SMoveDataComp) this.remove(SkillView) super.destroy(); } }