ObjectPool.cs
unknown
csharp
a year ago
2.6 kB
30
Indexable
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
/*
This class acts as Object Pool, so that we can instantiate as many objects as we need, then we do not call Instantiate during
gameplay. This way, we prevent slow-downs in the game.
PoolObjects is optional, but preferred to be called with specified amount.
*/
public abstract class ObjectPool<T> : Singleton<ObjectPool<T>> where T : MonoBehaviour
{
[SerializeField] protected T prefab;
private List<T> pooledObjects;
private int amount;
private bool isReady;
// Create with n amount of objects.
public void PoolObjects(int amount = 0) // like, Player has box thats nothing in it.
{
if(amount<0)
throw new ArgumentOutOfRangeException("Amount of pool must be non-negative");
this.amount= amount;
// Initialize the list
pooledObjects = new List<T>(amount);
// Instantiate T's for the list
GameObject newObject;
for(int i=0; i < amount; i++)
{
newObject = Instantiate(prefab.gameObject, transform);
newObject.SetActive(false);
pooledObjects.Add(newObject.GetComponent<T>());
}
// give ready flag
isReady = true;
}
// get an object from the pool
public T GetPooledObject()
{
// check if ready, if not, then make it ready
if (!isReady)
PoolObjects(1);
// search through list for something not in use and return it
for (int i =0; i != amount; ++i)
if(!pooledObjects[i].isActiveAndEnabled) // again this active and enabled thing is from MonoBehaviour
return pooledObjects[i];
// if we didnt find anything, make a new one
GameObject newObject = Instantiate(prefab.gameObject, transform);
newObject.SetActive(false);
pooledObjects.Add(newObject.GetComponent<T>());
++amount;
return newObject.GetComponent<T>();
//
}
public void ReturnObjectToPool(T returningObject)
{
// verify
if(returningObject == null)
return;
// make sure pool is ready, if not make it ready
if (!isReady)
{
PoolObjects();
pooledObjects.Add(returningObject);
amount++;
}
returningObject.gameObject.SetActive(false);
// deactive the object
}
}
Editor is loading...
Leave a Comment