refactor(skill): 重构技能系统以支持对象池复用

将技能节点管理改为使用对象池模式,提高性能
添加技能节点复用时的初始化逻辑
统一技能组件获取和重置方式
更新英雄配置中的默认技能
This commit is contained in:
walkpan
2026-01-02 23:37:20 +08:00
parent 81f55a796d
commit 557e43ed29
3 changed files with 60 additions and 10 deletions

View File

@@ -1,4 +1,4 @@
import { BoxCollider2D, instantiate, Node, Prefab, v3, Vec3 } from "cc";
import { BoxCollider2D, instantiate, Node, Prefab, v3, Vec3, NodePool } 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";
@@ -13,10 +13,34 @@ import { smc } from "../common/SingletonModuleComp";
/** Skill 模块 */
@ecs.register(`Skill`)
export class Skill extends ecs.Entity {
/** 多键对象池Map<prefabPath, NodePool> */
static pools: Map<string, NodePool> = new Map();
static getFromPool(path: string): Node | null {
if (this.pools.has(path)) {
const pool = this.pools.get(path)!;
if (pool.size() > 0) {
return pool.get();
}
}
return null;
}
static putToPool(path: string, node: Node) {
if (!this.pools.has(path)) {
this.pools.set(path, new NodePool());
}
this.pools.get(path)!.put(node);
}
/** ---------- 数据层 ---------- */
SDataCom!: SDataCom;
SMoveCom!: SMoveDataComp
/** 当前技能的预制体路径(用于对象池回收) */
private prefabPath: string = "";
private skillNode: Node | null = null; // 持有节点引用以便销毁时回收
/** ---------- 业务层 ---------- */
// SkillBll!: SkillBllComp;
@@ -73,8 +97,11 @@ export class Skill extends ecs.Entity {
node.setPosition(startPos);
// 初始化移动组件 - 从SkillView获取移动参数
const sMoveCom = this.get(SMoveDataComp);
let sMoveCom = this.get(SMoveDataComp);
if (!sMoveCom) {
sMoveCom = this.add(SMoveDataComp);
}
sMoveCom.reset(); // 复用组件时重置状态
sMoveCom.startPos.set(startPos);
sMoveCom.targetPos.set(targetPos);
sMoveCom.s_uuid = s_uuid;
@@ -87,7 +114,11 @@ export class Skill extends ecs.Entity {
let cAttrsComp=caster.ent.get(HeroAttrsComp)
// 初始化数据组件
const sDataCom = this.get(SDataCom);
let sDataCom = this.get(SDataCom);
if (!sDataCom) {
sDataCom = this.add(SDataCom);
}
sDataCom.reset();
sDataCom.group=caster.box_group
sDataCom.caster=caster
sDataCom.Attrs={...cAttrsComp.Attrs}
@@ -101,7 +132,16 @@ export class Skill extends ecs.Entity {
// 注: 自定义释放逻辑,视图层实现 ecs.IComp 接口的 ecs 组件需要手动释放
this.remove(SDataCom);
this.remove(SMoveDataComp)
// 移除组件会触发 reset但我们在 reset 中移除了 destroy
this.remove(SkillView)
// 回收节点到对象池
if (this.skillNode && this.skillNode.isValid && this.prefabPath) {
Skill.putToPool(this.prefabPath, this.skillNode);
this.skillNode = null;
}
super.destroy();
}