1. 程式人生 > >【Unity】構建自己的GameObject快取池

【Unity】構建自己的GameObject快取池

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"); } } } }