using System; using System.Collections.Generic; using UnityEngine; using Object = UnityEngine.Object; public class FXPool : IDisposable where T : Enum { private Dictionary> PoolDic; private Dictionary PollPar; private List temp; private Transform objectPoolPar; public Func NewObjFunc; public Action RecObjFunc; public Action GetObjFunc; public FXPool(Transform _objectPoolPar = null) { objectPoolPar = _objectPoolPar; if (objectPoolPar == null) { objectPoolPar = new GameObject("ObjectPool").transform; objectPoolPar.localPosition = Vector3.zero; objectPoolPar.localEulerAngles = Vector3.zero; } PoolDic = new Dictionary>(); PollPar = new Dictionary(); temp = new List(); } public Obj GetObject(T key) where Obj : Object { Obj obj = null; if (!PoolDic.ContainsKey(key)) { AddKey(key); } if (PoolDic[key].Count > 0) { obj = PoolDic[key][0] as Obj; PoolDic[key].RemoveAt(0); } else { obj = LoadObject(key); } GetObjFunc?.Invoke(key, obj); return obj; } private void AddKey(T key) { PoolDic.Add(key, new List()); Transform par = new GameObject(key.ToString()).transform; par.SetParent(objectPoolPar); par.localScale = Vector3.one; par.localPosition = Vector3.zero; par.localEulerAngles = Vector3.zero; PollPar.Add(key, par.transform); } private Obj LoadObject(T key) where Obj : UnityEngine.Object { Obj obj = NewObjFunc?.Invoke(key) as Obj; if (obj != null) { GameObject go = obj as GameObject ?? (obj as Component).gameObject; if (PollPar.TryGetValue(key, out Transform par) && go != null) { go.transform.SetParent(par); } } return obj; } public void RecObject(T key, Object obj) { if (obj == null) return; if (!PoolDic.ContainsKey(key)) { PoolDic.Add(key, new List()); } GameObject go = obj as GameObject ?? (obj as Component).gameObject; if (PollPar.TryGetValue(key, out Transform par)) { go.transform.parent = (par); } RecObjFunc?.Invoke(key, obj); PoolDic[key].Add(obj); } public void RemoveKey(T key) { if (PoolDic.ContainsKey(key)) { foreach (Object item in PoolDic[key]) { if (item != null) { GameObject go = item as GameObject; if (go == null) { Component cot = item as Component; go = cot.gameObject; } GameObject.Destroy(go); } } PoolDic[key].Clear(); PoolDic.Remove(key); } } public void RemoveAll() { temp.Clear(); foreach (var item in PoolDic) { temp.Add(item.Key); } foreach (var item in temp) { RemoveKey(item); } temp.Clear(); } public void Dispose() { RemoveAll(); PoolDic = null; PollPar = null; temp = null; } }