← Code
Utility

Generic Object Pool

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);
    }
}