using System.Collections; using System.Collections.Generic; using UnityEngine; namespace TFramework { public class ObjectPool { private GameObject _objTemplate; private Queue _objPool; private int _maxCount; private TAction OnTakeOut; private TAction OnRecycle; List _initComponents = new List(); public ObjectPool(GameObject objTemplate, int maxCount, TAction takeOutEvent, TAction recycleEvent) { _objTemplate = objTemplate; _maxCount = maxCount; _objPool = new Queue(_maxCount); OnTakeOut = takeOutEvent; OnRecycle = recycleEvent; } public int Count => _objPool.Count; /// /// 取出对象 /// /// public GameObject TakeOutObj() { GameObject obj; if (Count > 0) obj = _objPool.Dequeue(); else obj = GameObject.Instantiate(_objTemplate); obj.SetActive(true); OnTakeOut?.Invoke(obj); return obj; } /// /// 回收对象 /// /// public void RecycleObj(GameObject obj) { obj.SetActive(false); _initComponents.Clear(); _initComponents.AddRange(obj.GetComponents()); foreach (var template in _objTemplate.GetComponents()) { for (int i = 0; i < _initComponents.Count; i++) { if (template.GetType().Equals(_initComponents[i].GetType())) { _initComponents[i] = template; _initComponents.Remove(_initComponents[i]); break; } } } OnRecycle?.Invoke(obj); if (Count >= _maxCount) GameObject.Destroy(obj); else _objPool.Enqueue(obj); } public void Clear() { while (Count > 0) { GameObject.Destroy(_objPool.Dequeue()); } } } }