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