import Singleton from '../Base/Singleton' import { instantiate, Node, Prefab } from 'cc' import { EntityTypeEnum } from '../Enum' import DataManager from './DataManager' import { ResourceManager } from './ResourceManager' export default class ObjectPoolManager extends Singleton { static get Instance() { return super.GetInstance() } private objectPool: Node = null private poolObjectMap: Map = new Map() private getObjectContainerName(objectName: EntityTypeEnum) { return objectName + 'Pool' } getPoolObject(objectName: EntityTypeEnum) { if (this.objectPool === null) { this.objectPool = new Node("ObjectPool") this.objectPool.setParent(DataManager.Instance.gm.stage) } if (!this.poolObjectMap.has(objectName)) { this.poolObjectMap.set(objectName, []) const container = new Node(this.getObjectContainerName(objectName)) container.setParent(this.objectPool) } let node: Node const nodes = this.poolObjectMap.get(objectName) const index = nodes.findIndex(node => node.active) if (index === -1) { const prefab = DataManager.Instance.prefabMap.get(objectName) node = instantiate(prefab) node.name = objectName node.setParent(this.objectPool.getChildByName(this.getObjectContainerName(objectName))) } else { node = nodes.splice(index, 1)[0] } node.active = true return node } returnPoolObject(object: Node) { object.active = false const objectName = object.name as EntityTypeEnum this.poolObjectMap.get(objectName).push(object) } }