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