DCS/ruiyiweiUX/Assets/Scripts/Base/ObjectPoolManager.cs

87 lines
2.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPoolManager : MonoBehaviour
{
public static ObjectPoolManager Instance { get; private set; }
// 多个对象池,每种类型一个 Queue
private Dictionary<string, Queue<GameObject>> poolDict = new Dictionary<string, Queue<GameObject>>();
// 记录每种类型的原始 prefab
// private Dictionary<string, GameObject> prefabDict = new Dictionary<string, GameObject>();
private void Awake()
{
if (Instance == null) Instance = this;
else Destroy(gameObject);
DontDestroyOnLoad(gameObject); // 保持池子跨场景有效
}
/// <summary>
/// 获取一个对象(从对象池中或新建)
/// </summary>
public GameObject Get(string key, GameObject prefab, Transform parent = null)
{
if (!poolDict.ContainsKey(key))
{
poolDict[key] = new Queue<GameObject>();
// prefabDict[key] = prefab;
}
GameObject obj;
if (poolDict[key].Count > 0)
{
obj = poolDict[key].Dequeue();
}
else
{
// obj = Instantiate(prefabDict[key]);
obj = Instantiate(prefab);
}
obj.SetActive(true);
if (parent != null)
obj.transform.SetParent(parent);
return obj;
}
/// <summary>
/// 回收一个对象(回到池中)
/// </summary>
public void Release(string key, GameObject obj)
{
if (!poolDict.ContainsKey(key))
{
Debug.LogWarning("ObjectPoolManager: 没有这个 key 的对象池:" + key);
Destroy(obj); return;
}
obj.SetActive(false);
obj.transform.SetParent(transform); // 可统一收纳到 manager 下
poolDict[key].Enqueue(obj);
}
/// <summary>
/// 清除所有池(可用于重启/清场)
/// </summary>
public void ClearAllPools()
{
foreach (var queue in poolDict.Values)
{
while (queue.Count > 0)
{
GameObject obj = queue.Dequeue();
Destroy(obj);
}
}
poolDict.Clear();
// prefabDict.Clear();
}
}