如何使用CocosCreator对象池

在运行时举办节点的建设( cc.instantiate )和销毁( node.destroy )操纵长短常淹灭机能的,因此我们在较量巨大的场景中,凡是只有在场景初始化逻辑( onLoad )中才会举办节点的建设,在切换场景时才会举办节点的销毁。假如建造有大量仇人或子弹需要重复活成和被没落的行动类游戏,我们要如安在游戏举办进程中随时建设和销毁节点呢?这里就需要工具池的辅佐了。

工具池就是一组可接纳的节点工具,我们通过建设cc.NodePool的实例来初始化一种节点的工具池。凡是当我们有多个 prefab 需要实例化时,应该为每个 prefab 建设一个 cc.NodePool 实例。

当我们需要建设节点时,向工具池申请一个节点,假如工具池里有空闲的可用节点,就会把节点返回给用户,用户通过node.addChild将这个新节点插手加入景节点树中。
当我们需要销毁节点时,挪用工具池实例的put(node) 要领,传入需要销毁的节点实例,工具池会自动完成把节点从场景节点树中移除的操纵,然后返回给工具池。

这样就实现了少数节点的轮回操作。

详细操纵 第一步:筹备好 Prefab

把你想要建设的节点事先配置好并做成 Prefab 资源,有些伴侣大概不会建造预制体?
(只需要将资源打点器里的资源 拉拽到 层级打点器中 然后 将节点在拉拽回 资源打点器)
这样就完成预制体的建设了!

第二步:初始化工具池

在场景加载的初始化剧本中,我们可以将需要数量的节点建设出来,并放进工具池:

properties: { enemyPrefab: cc.Prefab // 所需要的预制体 }, onLoad: function () { // 建设工具池 this.enemyPool = new cc.NodePool(); let initCount = 5; for (let i = 0; i < initCount; ++i) { let enemy = cc.instantiate(this.enemyPrefab); // 建设节点 this.enemyPool.put(enemy); // 通过 put 接口放入工具池 } }

工具池里需要的初始节点数量可以按照游戏的需要来节制,纵然我们对初始节点数量的预估禁绝确也没干系,后头我们会举办处理惩罚。

第三步:从工具池请求工具

接下来在我们的运行时代码中就可以用下面的方法来得到工具池中储存的工具了:

createEnemy: function (parentNode) { let enemy = null; if (this.enemyPool.size() > 0) { // 通过 size 接口判定工具池中是否有空闲的工具 // get()获取工具 enemy = this.enemyPool.get(); } else { // 假如没有空闲工具,也就是工具池中备用工具不足时,我们就用 cc.instantiate 从头建设 enemy = cc.instantiate(this.enemyPrefab); } enemy.parent = parentNode; // 将生成的仇人插手节点树 enemy.getComponent('Enemy').init(); //接下来就可以挪用 enemy 身上的剧本举办初始化 }

安详利用工具池的要点就是在 get 获取工具之前,永远都要先用 size 来判定是否有可用的工具,假如没有就利用正常建设节点的要领,固然会耗损一些运行时机能,但总比游戏瓦解要好!另一个选择是直接挪用 get ,假如工具池里没有可用的节点,会返回 null ,在这一步举办判定也可以。

第四步:将工具返回工具池

当我们杀死仇人时,需要将仇人节点退还给工具池,以备之后继承轮回操作,我们用这样的要领:

onEnemyKilled: function (enemy) { // enemy 应该是一个 cc.Node this.enemyPool.put(enemy); // 和初始化时的要领一样,将节点放进工具池,这个要了解同时挪用节点的 removeFromParent }

这样我们就完成了一个完整的轮回,主角需要刷几多怪都不成问题了!将节点放入和从工具池取出的操纵不会带来特另外内存打点开销,因此只要是大概,应该只管去操作。

第五步:利用组件来处理惩罚接纳和复用的事件

利用结构函数建设工具池时,可以指定一个组件范例或名称,作为挂载在节点上用于处理惩罚节点接纳和复用事件的组件。

在建设工具池时可以用:

let menuItemPool = new cc.NodePool('MenuItem'); // 指定一个组件范例

这样当利用 menuItemPool.get() 获取节点后,就会挪用 MenuItem 里的 reuse要领,完成点击事件的注册。
当利用menuItemPool.put(menuItemNode)接纳节点后,会挪用 MenuItem 里的 unuse要领,完成点击事件的反注册。

cc.Class({ extends: cc.Component, onLoad: function () { this.node.selected = false; this.node.on(cc.Node.EventType.TOUCH_END, this.onSelect, this.node); }, // put() 收回工具池时会挪用 unuse: function () { this.node.off(cc.Node.EventType.TOUCH_END, this.onSelect, this.node); }, // get()获取工具池内工具时会挪用 reuse: function () { this.node.on(cc.Node.EventType.TOUCH_END, this.onSelect, this.node); } });

别的 cc.NodePool.get() 可以传入任意数量范例的参数,这些参数会被原样通报给 reuse 要领:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsjfss.html