| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | using UnityEngine;using System.Collections.Generic;using FairyGUI.Utils;namespace FairyGUI{    /// <summary>    /// GObjectPool is use for GObject pooling.    /// </summary>    public class GObjectPool    {        /// <summary>        /// Callback function when a new object is creating.        /// </summary>        /// <param name="obj"></param>        public delegate void InitCallbackDelegate(GObject obj);        /// <summary>        /// Callback function when a new object is creating.        /// </summary>        public InitCallbackDelegate initCallback;        Dictionary<string, Queue<GObject>> _pool;        Transform _manager;        /// <summary>        /// 需要设置一个manager,加入池里的对象都成为这个manager的孩子        /// </summary>        /// <param name="manager"></param>        public GObjectPool(Transform manager)        {            _manager = manager;            _pool = new Dictionary<string, Queue<GObject>>();        }        /// <summary>        /// Dispose all objects in the pool.        /// </summary>        public void Clear()        {            foreach (KeyValuePair<string, Queue<GObject>> kv in _pool)            {                Queue<GObject> list = kv.Value;                foreach (GObject obj in list)                    obj.Dispose();            }            _pool.Clear();        }        /// <summary>        ///         /// </summary>        public int count        {            get { return _pool.Count; }        }        /// <summary>        ///         /// </summary>        /// <param name="url"></param>        /// <returns></returns>        public GObject GetObject(string url)        {            url = UIPackage.NormalizeURL(url);            if (url == null)                return null;            Queue<GObject> arr;            if (_pool.TryGetValue(url, out arr)                && arr.Count > 0)                return arr.Dequeue();            GObject obj = UIPackage.CreateObjectFromURL(url);            if (obj != null)            {                if (initCallback != null)                    initCallback(obj);            }            return obj;        }        /// <summary>        ///         /// </summary>        /// <param name="obj"></param>        public void ReturnObject(GObject obj)        {            if (obj.displayObject.isDisposed)                return;            string url = obj.resourceURL;            Queue<GObject> arr;            if (!_pool.TryGetValue(url, out arr))            {                arr = new Queue<GObject>();                _pool.Add(url, arr);            }            if (_manager != null)                obj.displayObject.cachedTransform.SetParent(_manager, false);            arr.Enqueue(obj);        }    }}
 |