using System.Collections.Generic;
namespace UnityEngine
{
public class Pool : MonoBehaviour
{
static private Pool _this;
static public Pool instance
{
get
{
if (_this == null)
{
GameObject pool = new GameObject("Pool");
pool.AddComponent<Pool>();
}
return _this;
}
}
private Dictionary<string, GameObject> poolPrefab = new Dictionary<string, GameObject>();
private Dictionary<string, Queue<GameObject>> pools = new Dictionary<string, Queue<GameObject>>();
private Dictionary<string, int> poolCount = new Dictionary<string, int>();
public GameObject this[string name]
{
get { return GetObj(name); }
set { RecoverObj(value); }
}
private void Awake()
{
if (_this == null)
{
_this = this;
}
else
{
Destroy(this.gameObject);
throw new System.Exception("已经存在有Pool组件的GameOject");
}
}
public void SetDontDestroy()
{
DontDestroyOnLoad(this.gameObject);
}
//初始化对象池
//reset:重置transform
public Pool Init(GameObject prefab, int count = 0, bool reset = false)
{
if (prefab == null)
{
Debug.LogError("要初始化的对象为空");
}
else
{
if (poolPrefab.ContainsKey(prefab.name))
{
Debug.LogWarning("已经初始化了:" + prefab.name);
}
else
{
poolPrefab.Add(prefab.name, prefab);
Queue<GameObject> gos = new Queue<GameObject>();
for (int i = 0; i < count; i++)
{
GameObject go = Instantiate(prefab);
if (reset)
{
go.transform.localPosition = Vector3.zero;
go.transform.localRotation = Quaternion.Euler(Vector3.zero);
go.transform.localScale = Vector3.one;
}
go.transform.SetParent(this.transform);
go.SetActive(false);
gos.Enqueue(go);
}
pools.Add(prefab.name, gos);
}
}
return instance;
}
public bool Has(string name)
{
return poolPrefab.ContainsKey(name);
}
//设置对象容量
public void SetResize(string name, int count)
{
if (pools.ContainsKey(name))
{
if (poolCount.ContainsKey(name))
{
poolCount[name] = Mathf.Max(count, pools[name].Count);
}
else
{
poolCount.Add(name, Mathf.Max(count, pools[name].Count));
}
}
else
{
Debug.LogErrorFormat("没有{0}这个对象", name);
}
}
private int Stock(string name)
{
if (poolCount.ContainsKey(name))
{
return poolCount[name];
}
return int.MaxValue;
}
private void Transfer(string name)
{
if (poolCount.ContainsKey(name))
poolCount[name] = Mathf.Max(--poolCount[name], 0);
}
//获取对象
public GameObject GetObj(string name)
{
GameObject temp = null;
if (poolPrefab.ContainsKey(name))
{
if (Stock(name) > 0)
{
if (pools[name].Count > 0)
{
temp = pools[name].Dequeue();
temp.transform.SetParent(null);
}
else
{
temp = Instantiate(poolPrefab[name]);
}
temp.SetActive(true);
Transfer(name);
}
else
{
Debug.LogWarning(name + "对象数量不足");
}
}
else
{
Debug.LogError("没有初始化" + name);
}
return temp;
}
//回收对象
//reset:重置transform
public void RecoverObj(GameObject go, bool reset = false)
{
if (go == null) return;
if (poolPrefab.ContainsKey(go.name))
{
go.transform.SetParent(this.transform);
if (reset)
{
go.transform.localPosition = Vector3.zero;
go.transform.localRotation = Quaternion.Euler(Vector3.zero);
go.transform.localScale = Vector3.one;
}
go.SetActive(false);
pools[go.name].Enqueue(go);
return;
}
Destroy(go);
}
//移除对象
public void Reomve(string name)
{
if (poolPrefab.ContainsKey(name))
{
foreach (GameObject go in pools[name])
{
Destroy(go);
}
pools[name] = null;
pools.Remove(name);
poolPrefab.Remove(name);
}
}
public void Reomve(GameObject go)
{
if (go != null)
Reomve(go.name);
}
private void OnDestroy()
{
Pool._this = null;
}
}
}
简易的对象池单例类
于 2022-03-03 14:59:26 首次发布