public void DeregisterPooledObject(string objectId) { // assert that a pool with this id exists if (!_objectPool.ContainsKey(objectId)) { CustomLogger.Error(nameof(PooledObjectManager), $"Does not contain entry with id {objectId}!"); return; } // despawn all currently active pooled objects List <PooledObject> objsToRemove = new List <PooledObject>(); for (int i = 0; i < _objectPool[objectId].InUseObjects.Count; i++) { PooledObject pooledObject = _objectPool[objectId].InUseObjects[i]; pooledObject.Despawn(); pooledObject.Dispose(); objsToRemove.Add(pooledObject); } _objectPool[objectId].AvailableObjects.AddRange(objsToRemove); // remove all existing pooled objects foreach (PooledObject pooledObject in _objectPool[objectId].AvailableObjects) { GameObject go = _objectPool[objectId].GameObjects[pooledObject]; Destroy(go); } _objectPool.Remove(objectId); }
private void CleanUpInteractables() { for (int i = 0; i < _interactables.Count; i++) { _interactables[i].SetInteractable(false); PooledObject pooledObject = _interactables[i] as PooledObject; if (pooledObject != null) { pooledObject.Despawn(); pooledObject.Dispose(); } } }
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 } }
public PooledObject GetObjectFromPool() { // Ensure that we are not going to break the size of the array if (cursorIndex + 1 >= pooledObjectList.Count) { // If the cursor is pointing outside of the list, change it to point to the first item cursorIndex = 0; } // Get reference from the item PooledObject target = pooledObjectList[cursorIndex]; // If this pool object is on screen, force to kill it from the screen first if (target.gameObject.activeSelf) { target.Despawn(); } // Increase the cursor cursorIndex++; return(target); }
void Despawn() { persistentPoolObj.Despawn(); scenePoolObj.Despawn(); }