File was renamed from Utility/GameObjectPool.cs |
| | |
| | | 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
|
| | | {
|
| | | Debug.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
|
| | | }
|
| | | 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 |
| | | { |
| | | Debug.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 |
| | | } |