Files
Cocos3.8.5/assets/script/manager/PoolManager.ts
ZhouXiao 487c68994d feat: add builder configuration file
feat: add cocos-service configuration file
feat: add device configuration file
feat: add engine configuration file
feat: add information configuration file
feat: add program configuration file
feat: add project configuration file
feat: add TypeScript configuration file
2025-12-22 11:42:51 +08:00

127 lines
3.5 KiB
TypeScript

import { _decorator, Director, director, instantiate, Node, NodePool, Prefab } from 'cc';
const { ccclass, property } = _decorator;
export class PoolManager {
private static _instance: PoolManager = new PoolManager();
private constructor() { }
public static get _ins() {
return this._instance;
}
private prefabMap: Map<string, Prefab> = new Map();
private poolDic: Map<string, NodePool> = new Map();
/**
* 初始化
* @param resArr 预制体数组
* 如无出现BUG无须主动调用
*/
init(prefabs: Prefab[]) {
if (!prefabs || prefabs.length === 0) return;
// 清空之前的记录
this.prefabMap.clear();
// 使用 Map 存储,提高查询效率
prefabs.forEach(prefab => {
if (prefab && prefab.name) {
this.prefabMap.set(prefab.name, prefab);
}
});
}
/**
* 根据名称获取预制体
* @param url 预制体的res/Prefab/的路径 或者 resArr拖动的名字
*/
getNode(url: string) {
let prefab: Prefab = null;
if (this.prefabMap.has(url)) {
prefab = this.prefabMap.get(url);
}
if (!prefab) {
if (this.poolDic.has(url)) {
if (this.poolDic.get(url).size() > 0) {
const node = this.poolDic.get(url).get();
return node;
} else {
const node = new Node(url);
return node;
}
} else {
this.poolDic.set(url, new NodePool(url));
const node = new Node(url);
return node;
}
} else {
if (!this.poolDic.has(url)) {
const node = instantiate(prefab);
this.poolDic.set(url, new NodePool(url));
console.warn("First Init Pool: " + url);
return node;
} else {
const Pool = this.poolDic.get(url);
if (Pool.size() > 0) {
const node = Pool.get();
return node;
} else {
const node = instantiate(prefab);
return node;
}
}
}
}
/**
* 回收节点
* @param node 节点
* @param isRigiBody 是否是刚体
*/
recycleNode(node: Node, isRigiBody: boolean = false) {
const url = node.name;
if (isRigiBody) {
if (this.poolDic.has(url)) {
director.once(Director.EVENT_AFTER_PHYSICS, () => {
this.poolDic.get(url).put(node);
})
} else {
this.poolDic.set(url, new NodePool(url));
director.once(Director.EVENT_AFTER_PHYSICS, () => {
this.poolDic.get(url).put(node);
})
}
} else {
if (this.poolDic.has(url)) {
this.poolDic.get(url).put(node);
} else {
this.poolDic.set(url, new NodePool(url));
this.poolDic.get(url).put(node);
}
}
}
/**
* 清空所有节点池
*/
clearAllPool() {
for (let pool of this.poolDic.values()) {
pool.clear();
}
this.poolDic.clear();
}
/**
* 获取节点池字典
*/
getPoolDic() {
return this.poolDic;
}
}