Mr.Yuan Mr.Yuan

苟正其身矣,于从政乎何有?不能正其身,如正人何?

目录
Cocos 对象池 ---- 组件类方式
/    

Cocos 对象池 ---- 组件类方式

Cocos 对象池 ---- 组件类方式

const { ccclass, property } = cc._decorator

@ccclass
export class ccPool extends cc.Component {
    private poolNode: Map<string, cc.Node[]> = new Map()

    public clear(key: any) {
        if (this.poolNode.has(key)) {
            this.poolNode.get(key).forEach((item) => {
                item.active = false
                item.destroy()
            })
            this.poolNode.delete(key)
        }
    }

    public clearAll() {
        this.poolNode.forEach((item, key) => {
            item.forEach((item2) => {
                item2.active = false
                item2.destroy()
            })
            this.poolNode.delete(key)
        })
    }

    public recycle(node: cc.Node) {
        node.active = false
    }

    public recycleKey(key: string) {
        if (this.poolNode.has(key)) {
            this.poolNode.get(key).forEach((item) => {
                item.active = false
            })
        }
    }

    public create(_key: any, _prefab: cc.Node, _position: cc.Vec3): cc.Node {
        let _node = this.findUsabale(_key)

        if (_node != null) {
            // 如果有可用的对象
            _node.position = _position
            _node.active = true
        } else {
            // 如果没有可用的对象
            _node = cc.instantiate(_prefab)
            _node.position = _position
            _node.active = true
            _node.parent = this.node
            this.addObject(_key, _node)
        }
        return _node
    }

    private findUsabale(key: string): cc.Node | null {
        if (!this.poolNode.has(key)) return null
        const _node = this.poolNode.get(key).find((item) => !item.active)
        return _node
    }

    /**
     * 添加到 poolnode
     * @param key
     * @param node
     */
    private addObject(key: string, node: cc.Node) {
        if (!this.poolNode.has(key)) this.poolNode.set(key, [])
        this.poolNode.get(key).push(node)
    }
}

使用说明

cocos creator 挂载节点上 所有的对象会添加到子节点当中

复用仅仅是更改对象节点的 active 尽可能的复用节点

//创建
cc.Pool.create(key, prefab, position);
// 回收
ccPool.recycle(node);

标题:Cocos 对象池 ---- 组件类方式
作者:K
地址:https://pala.icu/articles/2021/09/02/1630593847103.html