refactor(skill): 重构技能系统以支持对象池复用
将技能节点管理改为使用对象池模式,提高性能 添加技能节点复用时的初始化逻辑 统一技能组件获取和重置方式 更新英雄配置中的默认技能
This commit is contained in:
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user