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