using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using DevelopEngine; namespace XFramework.Objects { /// /// 对象池管理 /// public class ObjectPool : MonoSingleton { /// /// 存放所有对象池的字典 /// 每一个原始对象都有一个id,每个id就对应一个对象池 /// private Dictionary> originalDict; /// /// 存放所有已经被实例化对象 /// 每一个被实例化后的对象都有相应的对象池 /// private Dictionary> objPoolDict; /// /// 场景里面的对象 /// 用于将已经释放的对象收起来 /// private GameObject poolManager; //private GameRoot Game { get => GameRoot.Instance; } private void Awake() { originalDict = new Dictionary>(); objPoolDict = new Dictionary>(); } // Start is called before the first frame update void Start() { poolManager = this.gameObject;//GameObject.Find("PoolManager") ?? new GameObject("PoolManager"); } /// /// 根据原始对象获取对应的对象池 /// /// 对象 /// private SingleObjPool GetPool(GameObject prefab) { int id = prefab.GetInstanceID(); if (!originalDict.ContainsKey(id)) { SingleObjPool objPool = new SingleObjPool(prefab); originalDict.Add(id, objPool); } return originalDict[id]; } /// /// 从对象池里获取一个对象 /// /// 对象 /// private GameObject GetObject(GameObject prefab) { GameObject obj = GetPool(prefab).Get(); if (!objPoolDict.ContainsKey(obj)) objPoolDict.Add(obj, GetPool(prefab)); obj.SetActive(true); return obj; } /// /// 从对象池取出一个对象 /// /// /// public GameObject Instantiate(GameObject prefab) { GameObject obj = GetObject(prefab); obj.transform.SetParent(null); return obj; } /// /// 从对象池取出一个对象 /// /// 对象 /// 父对象 /// public GameObject Instantiate(GameObject prefab, Transform parent) { GameObject obj = GetObject(prefab); obj.transform.SetParent(parent); return obj; } /// /// 从对象池取出一个对象 /// /// 对象 /// 位置 /// 旋转 /// public GameObject Instantiate(GameObject prefab, Vector3 position, Quaternion rotation) { GameObject obj = GetObject(prefab); obj.transform.position = position; obj.transform.rotation = rotation; obj.transform.SetParent(null); return obj; } /// /// 从对象池取出一个对象 /// /// 对象 /// 位置 /// 旋转 /// 父对象 /// public GameObject Instantiate(GameObject prefab, Vector3 position, Quaternion rotation, Transform parent) { GameObject obj = GetObject(prefab); obj.transform.position = position; obj.transform.rotation = rotation; obj.transform.SetParent(parent); return obj; } /// /// 立即回收对象 /// /// 要回收的对象 /// 回收对象后执行的方法 public void Destroy(GameObject prefab, UnityAction action = null) { if (!objPoolDict.ContainsKey(prefab)) return; if (prefab == null|| poolManager==null) return; SingleObjPool objPool = objPoolDict[prefab]; if (objPool.Release(prefab)) { objPoolDict.Remove(prefab); prefab.SetActive(false); prefab.transform.SetParent(poolManager.transform); action?.Invoke(prefab); } } /// /// 延迟执行回收 /// /// 要回收的对象 /// 延迟时间 /// 回收对象后执行的方法 public void Destroy(GameObject prefab, float time, UnityAction action = null) { StartCoroutine(Delay(prefab, time, action)); } /// /// 延迟 /// /// /// /// /// private IEnumerator Delay(GameObject prefab, float time, UnityAction action) { yield return new WaitForSeconds(time); Destroy(prefab, action); } } }