【Unity】構建自己的GameObject快取池
阿新 • • 發佈:2019-02-20
using Game.Manager.Base;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Game.Common
{
public class PoolManager : BaseManager<PoolManager>
{
private Dictionary<string, Queue<GameObject>> m_Pool;
private Dictionary<GameObject, string > m_GoTag;
/// <summary>
/// 初始化管理器
/// </summary>
public override void Init()
{
ClearAll();
}
/// <summary>
/// 清空快取池,釋放所有引用
/// </summary>
public void ClearAll()
{
m_Pool = new Dictionary<string , Queue<GameObject>>();
m_GoTag = new Dictionary<GameObject, string>();
}
/// <summary>
/// 回收GameObject
/// </summary>
/// <param name="go"></param>
public void ReturnGameObejct(GameObject go)
{
Debug.Assert(go.activeSelf, "gameObject is not active" );
go.SetActive(false);
string tag = m_GoTag[go];
RemoveOutMark(go);
if (!m_Pool.ContainsKey(tag))
{
m_Pool[tag] = new Queue<GameObject>();
}
m_Pool[tag].Enqueue(go);
}
/// <summary>
/// 請求GameObject
/// </summary>
/// <param name="prefab"></param>
/// <param name="parent"></param>
/// <returns></returns>
public GameObject RequestGameObejct(GameObject prefab, Transform parent)
{
string tag = prefab.GetInstanceID().ToString();
GameObject go = GetFromPool(tag);
if (go == null)
{
go = GameObject.Instantiate<GameObject>(prefab, parent);
}
go.transform.SetParent(parent);
MarkAsOut(go, tag);
return go;
}
//從快取池中取出
private GameObject GetFromPool(string tag)
{
if (m_Pool.ContainsKey(tag) && m_Pool[tag].Count > 0)
{
GameObject obj = m_Pool[tag].Dequeue();
obj.SetActive(true);
return obj;
}
else
{
return null;
}
}
//記錄GameObject對應的tag
private void MarkAsOut(GameObject go, string tag)
{
m_GoTag.Add(go, tag);
}
//去除GameObject的tag標記
private void RemoveOutMark(GameObject go)
{
if (m_GoTag.ContainsKey(go))
{
m_GoTag.Remove(go);
}
else
{
Debug.LogError("remove out mark error, gameObject has not been marked");
}
}
}
}