using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; namespace YKMoon { public class ObjectPool where T : new() { private readonly Stack m_Stack = new Stack(); private readonly UnityAction m_ActionOnGet; private readonly UnityAction m_ActionOnRelease; public int countAll { get; private set; } public int countActive { get { return countAll - countInactive; } } public int countInactive { get { return m_Stack.Count; } } public ObjectPool(UnityAction actionOnGet, UnityAction actionOnRelease) { m_ActionOnGet = actionOnGet; m_ActionOnRelease = actionOnRelease; } public T Get() { T element; if(m_Stack.Count == 0) { element = new T(); countAll++; } else { element = m_Stack.Pop(); } if(m_ActionOnGet != null) m_ActionOnGet(element); return element; } public void Release(T element) { if(m_Stack.Count > 0 && ReferenceEquals(m_Stack.Peek(), element)) Debug.LogError("Internal error. Trying to destroy object that is already released to pool."); if(m_ActionOnRelease != null) m_ActionOnRelease(element); m_Stack.Push(element); } public void Clear() { m_Stack.Clear(); countAll = 0; } } }