Generic Pool
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool<T> : MonoBehaviour where T : MonoBehaviour, IPoolable
{
[SerializeField] private int poolSize = 5;
[SerializeField] private T prefab;
private List<T> pool = new List<T>();
void Awake()
{
for (int i = 0; i < poolSize; i++)
{
var obj = CreateNew();
pool.Add(obj);
}
}
private T CreateNew()
{
T obj = Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
obj.gameObject.SetActive(false);
return obj;
}
public T Get()
{
T obj = pool.Find(o => !o.IsInUse);
if (obj == null)
{
obj = CreateNew();
pool.Add(obj);
}
obj.gameObject.SetActive(true);
obj.IsInUse = true;
return obj;
}
public void Return(T obj)
{
obj.IsInUse = false;
obj.gameObject.SetActive(false);
}
}