| using System.Collections;  | 
| using System.Collections.Generic;  | 
| using UnityEngine;  | 
|   | 
|   | 
| public class GameObjectPool  | 
| {  | 
|   | 
|     private List<GameObject> m_FreeList;  | 
|     private List<GameObject> m_ActiveList;  | 
|     private GameObject m_Prefab;  | 
|   | 
|     public int nameHashCode;  | 
|     public string name;  | 
|   | 
|     public GameObjectPool(GameObject prefab)  | 
|     {  | 
|         name = prefab.name;  | 
|         nameHashCode = name.GetHashCode();  | 
|   | 
|         m_Prefab = prefab;  | 
|         m_FreeList = new List<GameObject>();  | 
|         m_ActiveList = new List<GameObject>();  | 
|     }  | 
|   | 
|     public GameObject Request()  | 
|     {  | 
|         GameObject _gameObject = null;  | 
|         if (m_FreeList.Count == 0)  | 
|         {  | 
|             _gameObject = Object.Instantiate(m_Prefab);  | 
|             _gameObject.name = name;  | 
|         }  | 
|         else  | 
|         {  | 
|             _gameObject = m_FreeList[0];  | 
|             m_FreeList.RemoveAt(0);  | 
|         }  | 
|         m_ActiveList.Add(_gameObject);  | 
|         return _gameObject;  | 
|     }  | 
|   | 
|     public void Release(GameObject gameObject)  | 
|     {  | 
|         if (m_ActiveList.Contains(gameObject))  | 
|         {  | 
|             m_ActiveList.Remove(gameObject);  | 
|         }  | 
|         else  | 
|         {  | 
|             DebugEx.LogWarningFormat("所回收的go对象 {0} 并不是从池里取得的...", gameObject.name);  | 
|         }  | 
|         m_FreeList.Add(gameObject);  | 
|          | 
|     }  | 
|   | 
|     public void Clear()  | 
|     {  | 
|         foreach (var _item in m_FreeList)  | 
|         {  | 
|             Object.Destroy(_item);  | 
|         }  | 
|         foreach (var _item in m_ActiveList)  | 
|         {  | 
|             Object.Destroy(_item);  | 
|         }  | 
|         m_FreeList.Clear();  | 
|         m_ActiveList.Clear();  | 
|     }  | 
|   | 
|     public void Destroy()  | 
|     {  | 
|   | 
|         Clear();  | 
|   | 
|         m_Prefab = null;  | 
|   | 
|         m_FreeList = null;  | 
|         m_ActiveList = null;  | 
|     }  | 
|   | 
| #if UNITY_EDITOR  | 
|     public void ForeachActive(System.Action<GameObject> method)  | 
|     {  | 
|         for (int i = m_ActiveList.Count - 1; i >= 0; --i)  | 
|         {  | 
|             method(m_ActiveList[i]);  | 
|         }  | 
|     }  | 
|   | 
|     public void ForeachFree(System.Action<GameObject> method)  | 
|     {  | 
|         for (int i = m_FreeList.Count - 1; i >= 0; --i)  | 
|         {  | 
|             method(m_FreeList[i]);  | 
|         }  | 
|     }  | 
| #endif  | 
| }  |