| using System.Collections.Generic; | 
| using System; | 
| using UnityEngine; | 
|   | 
| public class ObjectPool<T> | 
| { | 
|     /// <summary> | 
|     /// 池的堆栈 | 
|     /// </summary> | 
|     private readonly Stack<T> m_Inactived = new Stack<T>(); | 
|   | 
|     /// <summary> | 
|     /// 池对象总数,包括已激活和未激活 | 
|     /// </summary> | 
|     public int totalCount; | 
|   | 
|     /// <summary> | 
|     /// 取得当前还有多少激活对象 | 
|     /// </summary> | 
|     public int activedCount | 
|     { | 
|         get | 
|         { | 
|             return totalCount - inactivedCount; | 
|         } | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 取得池里还有多少对象 | 
|     /// </summary> | 
|     public int inactivedCount | 
|     { | 
|         get | 
|         { | 
|             return m_Inactived.Count; | 
|         } | 
|     } | 
|   | 
|     private Action<T> m_OnObjectGet;// 供外部传入的回调方法,在获取对象的时候对该对象进行一些可能是初始化的操作 | 
|     private Action<T> m_OnObjectRelease;// 供外部传入的回调方法,在释放对象的时候对该对象进行一些可能是重置的操作 | 
|   | 
|     public ObjectPool(Action<T> onGetAction, Action<T> onReleaseAction) | 
|     { | 
|         m_OnObjectGet = onGetAction; | 
|         m_OnObjectRelease = onReleaseAction; | 
|     } | 
|   | 
|     public void Add(T element) | 
|     { | 
|         m_Inactived.Push(element); | 
|         totalCount++; | 
|     } | 
|   | 
|     public T Get() | 
|     { | 
|         T element; | 
|         // 错误保护 | 
|         if (inactivedCount == 0) | 
|         { | 
|             Debug.LogWarningFormat("获取池对象时,池已经为空."); | 
|             return default(T); | 
|         } | 
|         // 取得池对象 | 
|         element = m_Inactived.Pop(); | 
|         // 执行获取逻辑 | 
|         if (m_OnObjectGet != null) | 
|         { | 
|             m_OnObjectGet(element); | 
|         } | 
|         return element; | 
|     } | 
|   | 
|     public void Release(T element) | 
|     { | 
|         // 错误保护 | 
|         if (inactivedCount > 0 && ReferenceEquals(element, m_Inactived.Peek())) | 
|         { | 
|             Debug.LogWarningFormat("向池释放对象的时候发现,该对象已经被释放了.", element.ToString()); | 
|             return; | 
|         } | 
|         // 执行外部传入的释放逻辑 | 
|         if (m_OnObjectRelease != null) | 
|         { | 
|             m_OnObjectRelease(element); | 
|         } | 
|         m_Inactived.Push(element); | 
|     } | 
|   | 
|     public void Clear() | 
|     { | 
|         m_Inactived.Clear(); | 
|     } | 
| } |