const { ccclass, property } = cc._decorator;
@ccclass
export default class PoolManager extends cc.Component {
@property([cc.Prefab])
private allPrefab: cc.Prefab[] = [];
public static Instance: PoolManager = null;
private allPrefabMap: Map<string, cc.Prefab> = null;
private poolMap: Map<string, cc.NodePool> = null;
// LIFE-CYCLE CALLBACKS:
onLoad() {
if(PoolManager.Instance != null){
PoolManager.Instance.destroy();
}
PoolManager.Instance = this;
this.allPrefabMap = new Map<string, cc.Prefab>();
this.poolMap = new Map<string, cc.NodePool>();
for (let i = 0; i < this.allPrefab.length; i++) {
this.allPrefabMap.set(this.allPrefab[i].name, this.allPrefab[i]);
cc.log(this.allPrefab[i].name);
let nodePool = new cc.NodePool();
this.poolMap.set(this.allPrefab[i].name, nodePool);
}
}
/**从对象池中取出对象*/
public static Spawn(_prefabName: string, _parent: cc.Node = null) {
if (!PoolManager.Instance.poolMap.has(_prefabName)){
cc.warn('no prefab named ' + _prefabName);
return null;
}
let pool: cc.NodePool = PoolManager.Instance.poolMap.get(_prefabName);
if (pool.size() > 0) {
let object = pool.get();
if (_parent != null)
object.parent = _parent;
return object;
}
else {
let newObject = cc.instantiate(PoolManager.Instance.allPrefabMap.get(_prefabName));
if (_parent != null)
newObject.parent = _parent;
return newObject;
}
}
public static Despawn(_prefabName: string, _node: cc.Node) {
if (!PoolManager.Instance.poolMap.has(_prefabName)){
cc.log('回收失败,节点名 : ' + _prefabName);
return null;
}
let pool: cc.NodePool = PoolManager.Instance.poolMap.get(_prefabName);
pool.put(_node);
}
public static GetPrefab(_prefabName) {
if (!PoolManager.Instance.allPrefabMap.has(_prefabName))
return null;
return PoolManager.Instance.allPrefabMap.get(_prefabName);
}
public static Preload(_prefabName, _count) {
if (!PoolManager.Instance.poolMap.has(_prefabName))
return null;
let pool: cc.NodePool = PoolManager.Instance.poolMap.get(_prefabName);
for (let i = 0; i < _count; i++) {
let newObject = cc.instantiate(PoolManager.Instance.allPrefabMap.get(_prefabName));
pool.put(newObject);
}
}
}
将脚本挂在节点上,拖入prefab;
使用:生成 PoolManager.Spawn("预制体名字",父节点node)
回收 PoolManager.Despawn("预制体名字",回收的节点node)
公众号搜索:An的世界
新公众号,后续会发一些小游戏源码或教程~~