ObjectPoolManager.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { _decorator, Component, instantiate, Node, NodePool, Prefab, resources } from 'cc';
  2. import { PropBase } from './Base/PropBase';
  3. import { FloorType } from '../AutoBuild';
  4. const { ccclass, property } = _decorator;
  5. @ccclass('ObjectPoolManager')
  6. export class ObjectPoolManager extends Component {
  7. private static _instance: ObjectPoolManager;
  8. @property({ type: Prefab })
  9. private prefabs: Prefab[] = [];
  10. private pools: { [key: string]: NodePool } = {};
  11. public static getInstance(): ObjectPoolManager {
  12. if (!ObjectPoolManager._instance) {
  13. const node = new Node('ObjectPoolManager');
  14. ObjectPoolManager._instance = node.addComponent(ObjectPoolManager);
  15. }
  16. return ObjectPoolManager._instance;
  17. }
  18. private prefabPath = [
  19. 'Prefabs/diban',
  20. 'Prefabs/dici',
  21. ]
  22. private initPoolNodeCount = [
  23. 3,//prefabPath 每个分别创建多少个
  24. 1,//prefabPath 每个分别创建多少个
  25. ]
  26. public async initializePools(): Promise<boolean> {
  27. return new Promise((resolve, reject) => {
  28. resources.load(this.prefabPath, (err, prefabs: Prefab[]) => {
  29. if (err) {
  30. console.error(err);
  31. reject(err);
  32. return;
  33. }
  34. prefabs.forEach(prefab => {
  35. this.prefabs.indexOf(prefab) == -1 && this.prefabs.push(prefab);
  36. })
  37. this.prefabs.forEach(prefab => {
  38. const prefabName = prefab.name;
  39. this.pools[prefabName] = new NodePool(PropBase);
  40. this.initPoolNodeCount.forEach((count) => {
  41. for (let index = 0; index < count; index++) {
  42. let temp = instantiate(prefab)
  43. temp.name = prefabName;
  44. this.pools[prefabName].put(temp);
  45. }
  46. })
  47. resolve(true);
  48. })
  49. });
  50. });
  51. }
  52. getNodeFromPool(prefabName: FloorType, ParentNode: Node): Node {
  53. let prefab = this.prefabs.filter(prefab => prefab.name == prefabName);
  54. if (!prefab) {
  55. debugger
  56. }
  57. console.error(this.pools[prefabName].size());
  58. if (this.pools[prefabName].size() == 0) {
  59. let temp = instantiate(prefab[0])
  60. temp.name = prefabName;
  61. this.putNodeToPool(temp)
  62. }
  63. return this.pools[prefabName].get(ParentNode);
  64. }
  65. putNodeToPool(node: Node) {
  66. this.pools[node.name].put(node);
  67. }
  68. }