2025-06-07 17:43:34 +08:00

107 lines
2.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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