对象池cc.NodePool
把层级管理器中的节点拖进资源管理器中就创建了预制体;let和var 一样,是声明变量的关键词, 同一个变量名时,var 即使在{}内也作用全局,let有范围;(1)将需要数量的节点创建出来,并放进对象池://...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); // 通过 putInPool 接口放入对象池}}(2)获得对象池中储存的对象了:
// ...createEnemy: function (parentNode) { let enemy = null;if (this.enemyPool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象enemy = this.enemyPool.get();} else { // 如果没有空闲对象,就用 cc.instantiate 重新创建enemy = cc.instantiate(this.enemyPrefab);}enemy.parent = parentNode; // 将生成的敌人加入节点树enemy.getComponent('Enemy').init(); //接下来就可以调用 enemy 身上的脚本进行初始化}(3)节点退还给对象池,以备之后继续循环利用,:
// ...onEnemyKilled: function (enemy) { this.enemyPool.put(enemy); // 将节点放进对象池,这个方法会同时调用节点的 removeFromParent();}myPool.clear(); // 调用这个方法就可以清空对象池