HuaweiDemo/assets/script/framework/poolManager.ts

104 lines
2.5 KiB
TypeScript
Raw Permalink Normal View History

2023-11-07 01:17:57 +00:00
import { _decorator, Prefab, Node, instantiate, NodePool } from "cc";
const { ccclass, property } = _decorator;
@ccclass("PoolManager")
export class PoolManager {
private _dictPool: any = {}
private _dictPrefab: any = {}
static _instance: PoolManager;
static get instance() {
if (this._instance) {
return this._instance;
}
this._instance = new PoolManager();
return this._instance;
}
/**
*
*/
public getNode(prefab: Prefab, parent: Node) {
let name = prefab.name;
//@ts-ignore
if (!prefab.position) {
//@ts-ignore
name = prefab.data.name;
}
this._dictPrefab[name] = prefab;
let node: Node = null!;
if (this._dictPool.hasOwnProperty(name)) {
//已有对应的对象池
let pool = this._dictPool[name];
if (pool.size() > 0) {
node = pool.get();
} else {
node = instantiate(prefab);
}
} else {
//没有对应对象池,创建他!
let pool = new NodePool();
this._dictPool[name] = pool;
node = instantiate(prefab);
}
node.parent = parent;
node.active = true;
return node;
}
/**
*
*/
public putNode(node: Node) {
if (!node) {
return;
}
let name = node.name;
let pool = null;
if (this._dictPool.hasOwnProperty(name)) {
//已有对应的对象池
pool = this._dictPool[name];
} else {
//没有对应对象池,创建他!
pool = new NodePool();
this._dictPool[name] = pool;
}
pool.put(node);
}
/**
*
*/
public clearPool(name: string) {
if (this._dictPool.hasOwnProperty(name)) {
let pool = this._dictPool[name];
pool.clear();
}
}
/**
*
* @param prefab
* @param nodeNum
* 使PoolManager.instance.prePool(prefab, 40);
*/
public prePool(prefab: Prefab, nodeNum: number) {
const name = prefab.name;
let pool = new NodePool();
this._dictPool[name] = pool;
for (let i = 0; i < nodeNum; i++) {
const node = instantiate(prefab);
pool.put(node);
}
}
}