Files
heros/assets/script/game/skill/SkillEnt.ts

78 lines
2.8 KiB
TypeScript

import { instantiate, Node, Prefab, v3, Vec3 } from "cc";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { SkillSet } from "../common/config/SkillSet";
import { oops } from "db://oops-framework/core/Oops";
import { smc } from "../common/SingletonModuleComp";
import { FacSet } from "../common/config/BoxSet";
import { HType } from "../common/config/heroSet";
import { SkillViewCom } from "./SkillViewCom";
import { HeroViewComp } from "../hero/HeroViewComp";
/** SkillCon 模块 */
@ecs.register(`SkillEnt`)
export class SkillEnt extends ecs.Entity {
load(startPos: Vec3, parent: Node, uuid: number, targetPos: any[], caster:HeroViewComp=null,dmg:number=0) {
const config = SkillSet[uuid];
if (!config) {
console.error("[Skill] 技能配置不存在:", uuid);
return;
}
// 检查施法者
if (!caster) {
console.error("[Skill] 施法者为空");
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)
node.parent = parent;
// 设置节点属性
node.setPosition(startPos);
if(caster.fac==FacSet.MON){
node.scale=v3(node.scale.x*-1,1,1)
}else{
if(caster.type==HType.warrior){
if(caster.node.scale.x<0){
node.scale=v3(node.scale.x*-1,node.scale.y,1)
}
}
}
// 添加技能组件
const SComp = node.getComponent(SkillViewCom); // 初始化技能参数
// 只设置必要的运行时属性,配置信息通过 SkillSet[uuid] 访问
// 核心标识
SComp.s_uuid= uuid
SComp.cName=caster.hero_name
SComp.scale= caster.node.scale.x
// 位置和施法者信息
SComp.startPos= startPos
SComp.targetPos= targetPos
SComp.group= caster.box_group
SComp.fac= caster.fac,
// 技能数值(深拷贝避免引用问题)
SComp.Attrs = { ...caster.Attrs } // 或使用 Object.assign({}, caster.Attrs)
SComp.caster= caster,
this.add(SComp);
}
/** 实始添加的数据层组件 */
protected init() {
// this.addComponents<ecs.Comp>();
}
/** 模块资源释放 */
destroy() {
// 注: 自定义释放逻辑,视图层实现 ecs.IComp 接口的 ecs 组件需要手动释放
this.remove(SkillViewCom);
super.destroy();
}
}