PoolSystem.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /**
  2. * @description 对象池管理类
  3. * @author 邹勇
  4. */
  5. export default class PoolSystem {
  6. constructor() {
  7. }
  8. private poolList: Map<string, cc.NodePool>;
  9. public async init(pools: { url: string, num: number }[]) {
  10. this.poolList = new Map<string, cc.NodePool>();
  11. for (let i = 0; i < pools.length; i++) {
  12. let item = pools[i];
  13. let prefab = await mk.loader.load(item.url, cc.Prefab);
  14. if (!prefab) {
  15. console.log("没有找到该prefab", item.url);
  16. continue;
  17. }
  18. var pool: cc.NodePool = new cc.NodePool();
  19. for (let i = 0; i < item.num; ++i) {
  20. let node = cc.instantiate(prefab);
  21. pool.put(node);
  22. }
  23. let arr = item.url.split("/");
  24. this.poolList.set(arr[arr.length - 1], pool);
  25. }
  26. }
  27. /**
  28. * 获取prefab的node
  29. * @param url
  30. * @returns
  31. */
  32. public async getPrefab(url: string) {
  33. let arr = url.split("/");
  34. let name = arr[arr.length - 1];
  35. var pool = this.poolList.get(name);
  36. let node: cc.Node = null;
  37. if (pool && pool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
  38. node = pool.get();
  39. } else {
  40. let prefab = await mk.loader.load(url, cc.Prefab);
  41. node = cc.instantiate(prefab);
  42. pool && pool.put(node);
  43. }
  44. return node;
  45. }
  46. /**
  47. * 退回对象池
  48. * @param name prefab名字
  49. * @param node
  50. */
  51. return(name, node: cc.Node) {
  52. // node.destroy();
  53. node.removeFromParent();
  54. let pool = this.poolList[name];
  55. if (pool) {
  56. pool.put(node);
  57. }
  58. }
  59. clearPool(name) {
  60. if (this.poolList[name]) {
  61. this.poolList[name].clear();
  62. }
  63. }
  64. }