public bool RegisterPooledObject(string poolId, int count, Action <bool> OnRegisterComplete = null) { PooledObjectEntry entry; if (_objectPool.TryGetValue(poolId, out entry)) { return(true); } GameObject storedPrefab = AssetManager.Instance.GetAsset(poolId); if (storedPrefab == null) { CustomLogger.Error(nameof(PooledObjectManager), $"Failed to register object with id {poolId}"); return(false); } PooledObject pooledObject = storedPrefab.GetComponent <PooledObject>(); if (pooledObject == null) { CustomLogger.Error(nameof(PooledObjectManager), $"Asset is not a pooled object!"); return(false); } PooledObjectEntry newEntry = new PooledObjectEntry() { BaseResource = storedPrefab, AvailableObjects = new List <PooledObject>(), InUseObjects = new List <PooledObject>() }; _objectPool.Add(poolId, newEntry); CloneToPool(poolId, newEntry.BaseResource, count); return(true); }
private void CloneToPool(string poolId, GameObject resource, int count) { PooledObjectEntry entry = _objectPool[poolId]; int currentCount = entry.AvailableObjects.Count + entry.InUseObjects.Count; if (currentCount + count > MaximumObjectPoolSize) { CustomLogger.Warn(nameof(PooledObjectManager), $"Max pool size reached for {poolId}"); count = MaximumObjectPoolSize - currentCount; } for (int i = 0; i < count; i++) { GameObject clone = Instantiate(resource, transform); clone.name = poolId; PooledObject clonePO = clone.GetComponent <PooledObject>(); _objectPool[poolId].AvailableObjects.Add(clonePO); _objectPool[poolId].GameObjects.Add(clonePO, clone); clonePO.Despawn(); // hide the object } }