refactor(skill): 重构技能盒子管理为ECS实体架构

新增SBox ECS实体,统一管理技能盒子的创建、挂载与销毁
重构MissSkillsComp,改用SBox实体替代直接实例化技能节点
更新SkillBoxComp,新增实体引用以通过ECS生命周期销毁节点
临时调整SCastSystem的索敌范围为全屏级,方便测试
This commit is contained in:
pan
2026-06-04 14:41:27 +08:00
parent c5d521136d
commit efe6cc0dd7
5 changed files with 95 additions and 17 deletions

View File

@@ -0,0 +1,52 @@
import { instantiate, Prefab, Vec3, Node } from "cc";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { smc } from "../common/SingletonModuleComp";
import { SkillBoxComp } from "./SkillBoxComp";
/** SBox 实体:负责技能卡效果节点创建、初始化与销毁流程 */
@ecs.register(`SBox`)
export class SBox extends ecs.Entity {
/** 技能盒子视图和逻辑组件引用 */
SkillBox!: SkillBoxComp;
protected init() {
// 如果有纯逻辑数据组件可以在这里 addComponents
}
/** 销毁实体并释放视图节点,防止残留 */
destroy(): void {
const view = this.get(SkillBoxComp);
if (view && view.node && view.node.isValid) {
view.node.destroy();
}
this.remove(SkillBoxComp);
super.destroy();
}
/**
* 加载并初始化技能盒子
* 1) 创建节点并挂到 SKILL 层
* 2) 初始化表现与属性数据
*/
load(uuid: number, card_lv: number, pos: Vec3, prefab: Prefab): Node {
let node = instantiate(prefab);
let scene = smc.map.MapView.scene;
// 统一挂到实体显示层 SKILL 节点下
let parent = scene.entityLayer!.node!.getChildByName("SKILL");
if (parent) {
node.parent = parent;
}
node.setPosition(pos);
// 获取并注册组件
let sboxComp = node.getComponent(SkillBoxComp) || node.addComponent(SkillBoxComp);
this.add(sboxComp);
// 初始化业务逻辑
sboxComp.init(uuid, card_lv);
return node;
}
}