///////// HELPER METHODS private void SetAvailabilityInPool(int objectType, GameObject objectKey, PoolingAvailability newAvailability) { //retreives the index of where the object key exists on the object type entry's list int objectDataIndex = GetObjectDataIndex(pool[objectType].objects, objectKey, objectType); //gets the pooled object data struct and sets the new availability if (objectDataIndex != -1) { PooledObjectData getObjectData = pool[objectType].objects[objectDataIndex]; getObjectData.availability = newAvailability; //places the modified pooled object data struct back into the object type entry's list pool[objectType].objects[objectDataIndex] = getObjectData; } }
// checks whether it can receive the object from the pool private RetrievedObjectData Retrieve(int objectType, RetrieveMethod method) { // retrieve nothing if the pool doesn't even have an entry for that object type if (!pool.ContainsKey(objectType)) { if (debug) { Debug.Log("[POOLER] No entry exists for " + objectType); } return(new RetrievedObjectData() { allowSpawning = true }); } // retrieve nothing if the pool for that object type hasn't been filled to the brim if (GetPoolCount(objectType) < GetSettingsMaxCount(objectType)) { if (debug) { Debug.Log("[POOLER] " + objectType + " is not at max capacity yet (" + GetPoolCount(objectType) + " < " + GetSettingsMaxCount(objectType) + ")"); } return(new RetrievedObjectData() { allowSpawning = true }); } switch (method) { // iterates from bottom to top of the object type's list looking for an object that is 'pooled' to be reused case RetrieveMethod.BOTTOM: for (int i = 0; i < pool[objectType].objects.Count; i++) { PooledObjectData pooledObjectData = pool[objectType].objects[i]; if (pooledObjectData.availability == PoolingAvailability.POOLED) { return new RetrievedObjectData() { retrievedObject = pooledObjectData.pooledObject } } ; } if (debug) { Debug.Log("[POOLER] All " + objectType + " objects are currently being used in game"); } return(new RetrievedObjectData() { allowSpawning = false }); } // if the pooling method used is undefined / null if (debug) { Debug.LogError("[POOLER] Unknown pool retrieving method"); } return(new RetrievedObjectData() { allowSpawning = false }); }