OvertakingLegend/Assets/Script/Tool/CachePoolManager.cs

111 lines
2.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 缓存池
/// </summary>
public class CachePoolManager:MBSingletonManager<CachePoolManager>
{
/// <summary>
/// 对象字典
/// </summary>
public Dictionary<string, List<GameObject>> objDic = new Dictionary<string, List<GameObject>>();
/// <summary>
/// 对象节点
/// </summary>
public Dictionary<string, Transform> nodes = new Dictionary<string, Transform>();
/// <summary>
/// 取对象
/// </summary>
/// <param name="obj">对象</param>
/// <returns></returns>
public GameObject Take(GameObject obj)
{
GameObject recordingObj = null;
if (objDic.ContainsKey(obj.name) && objDic[obj.name].Count > 0)
{
recordingObj = objDic[obj.name][0];
objDic[obj.name].RemoveAt(0);
}
else
{
recordingObj = GameObject.Instantiate(obj);
}
recordingObj.transform.SetParent(null);
recordingObj.name = obj.name;
recordingObj.gameObject.SetActive(true);
return recordingObj;
}
/// <summary>
/// 预加载
/// </summary>
public void Prestrain(GameObject obj,int number)
{
for (int i = 0; i < number; i++)
{
GameObject recordingObj = GameObject.Instantiate(obj);
Put(recordingObj);
}
}
/// <summary>
/// 存放
/// </summary>
/// <param name="obj">对象</param>
public void Put(GameObject obj)
{
string name = obj.name;
obj.gameObject.SetActive(false);
if (objDic.ContainsKey(name))
{
objDic[name].Add(obj);
}
else
{
objDic.Add(name, new List<GameObject>() { obj });
}
if (nodes.ContainsKey(obj.name))
{
obj.transform.SetParent(nodes[obj.name]);
}
else
{
GameObject node = new GameObject(obj.name);
node.transform.SetParent(this.transform);
obj.transform.SetParent(node.transform);
node.transform.localPosition = Vector3.zero;
node.transform.localScale = Vector3.one;
nodes.Add(obj.name, node.transform);
}
}
/// <summary>
/// 清空
/// </summary>
public void Clear()
{
StartCoroutine(IE_Destroy());
}
/// <summary>
/// 清空的协程
/// </summary>
private IEnumerator IE_Destroy()
{
for (int i = this.transform.childCount-1; i >=0; i--)
{
Destroy(this.transform.GetChild(i).gameObject);
yield return null;
}
objDic.Clear();
nodes.Clear();
}
}