Unity中的对象池

自闭症网瘾萝莉.ら 提交于 2019-12-01 23:01:10
namespace ObjectPool {
    public class GameObjectPool
    {
        public GameObjectPool.InitCallbackDelegate initCallback;
        private Dictionary<string, Queue<GameObject>> _pool;
        private Transform _manager;

        public GameObjectPool(Transform manager)
        {
            this._manager = manager;
            this._pool = new Dictionary<string, Queue<GameObject>>();
        }

        public void Clear()
        {
            foreach (KeyValuePair<string, Queue<GameObject>> keyValuePair in this._pool)
            {
                foreach (GameObject go in keyValuePair.Value)
                    GameObject.Destroy(go);
            }
            this._pool.Clear();
        }

        public int count
        {
            get
            {
                return this._pool.Count;
            }
        }

        public GameObject GetObject(string url)
        {
            url = UIPackage.NormalizeURL(url);
            if (url == null)
                return (GameObject)null;
            Queue<GameObject> GameObjectQueue;
            if (this._pool.TryGetValue(url, out GameObjectQueue) && GameObjectQueue.Count > 0)
                return GameObjectQueue.Dequeue();
            //TODO FIX:修改为获取对象的渠道
            GameObject objectFromUrl = null;
            if (objectFromUrl != null && this.initCallback != null)
                this.initCallback(objectFromUrl);
            return objectFromUrl;
        }

        public void ReturnObject(GameObject obj)
        {
            //TODO FIX:修改为obj的Instanceid;
            string resourceUrl = obj.GetInstanceID().ToString();
            Queue<GameObject> GameObjectQueue;
            if (!this._pool.TryGetValue(resourceUrl, out GameObjectQueue))
            {
                GameObjectQueue = new Queue<GameObject>();
                this._pool.Add(resourceUrl, GameObjectQueue);
            }
            ToolSet.SetParent(obj.transform, this._manager);
            GameObjectQueue.Enqueue(obj);
        }

        public delegate void InitCallbackDelegate(GameObject obj);
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!