【Unity】构建自己的GameObject缓存池

来源:互联网 发布:淘宝店主最后说两句 编辑:程序博客网 时间:2024/05/16 01:07
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");            }        }    }}
0 0
原创粉丝点击