天天看點

cocoscreator對象池管理器

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

新公衆号,後續會發一些小遊戲源碼或教程~~

繼續閱讀