using System.Collections.Generic;
using UnityEngine;
public class SimplePool : MonoBehavior
{
// 物體的池子,用字典表示。鍵為種類 ID,值是同類物體的隊列
// 以預(yù)制體的 ID 作為每個種類的標識 ID
private Dictionary<int, Queue<GameObject>> m_Pool = new Dictionary<int, Queue<GameObject>>{};
// 記錄所有離開對象池的物體。鍵是物體引用,值是種類 ID
// 離開對象池的物體會從 m_Pool 中離開,但是要記錄在 m_OutObjs 字典里
private Dictionary<GameObject, int> m_OutObjs = new Dictionary<GameObject, int>{};
// 創(chuàng)建物體,預(yù)制體由調(diào)用者自備
public GameObject Create(GameObject prefab)
{
// 以預(yù)制體的物體 ID,作為該類型物體的 ID
int id = prefab.GetInstanceID();
// 嘗試從對象池中獲取這個物體
GameObject go = _GetFromPool(id);
if(go == null)
{
// 取不到物體,就根據(jù)預(yù)制體創(chuàng)建物體
go = Instantiate<GameObject>(prefab);
// 如果初次遇到這類物體,需要添加一個新的類型
if(!m_Pool.ContainsKey(id))
{
m_Pool.Add(id, new Queue<GameObject>());
}
}
// 標記新創(chuàng)建的物體離開了對象池
m_OutObjs.Add(go, id);
return go;
}
// 銷毀(回收)物體
public void Destroy(GameObject go)
{
// 判斷物體是不是由對象池創(chuàng)建
if(!m_OutObjs.ContainsKey(go))
{
Debug.LogWarning("回收的物體并不是對象池創(chuàng)建的!" + go);
return;
}
// 該物體屬于哪個種類
int id = m_OutObjs[go];
go.transform.parent = transform;
go.SetActive(false);
// 加入隊列,并且去掉離開的標記
m_Pool[id].Enqueue(go);
m_OutObjs.Remove(go);
}
// 從對象池中根據(jù)類型 ID 取出物體。如果類型不存在或者物體暫時用完了,返回 null
private GameObject _GetFromPool(int id)
{
if(!m_Pool.ContainsKey(id) || m_Pool[id].Count == 0)
{
return null;
}
GameObject obj = m_Pool[id].Dequeue();
obj.SetActive(true);
return obj;
}
}
Unity簡單的對象池實例
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 我們使用等待超時模式來構(gòu)造一個簡單的數(shù)據(jù)庫連接池,在示例中模擬從連接池中獲取、使用和釋放連接的過程。而客戶...
- 最近在工作中碰到了一個bug,這個bug非常充分地表明:SAP的開發(fā)語言ABAP是一種hybrid型語言, 即A ...
- 類對象:類名所對應(yīng)的內(nèi)存空間 類屬性:所有的類對象和實例對象都可以直接訪問 類方法:第一個形參是類對象cls,其上...