using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace TFramework { public class ReferencePoolManager : BaseManager { private Dictionary _referencePools = new Dictionary(); public int Limit { get; set; } = 100; /// /// 获取引用数量 /// /// 引用类型 /// 引用数量 public int GetRerenceCount(Type type) { if (_referencePools.ContainsKey(type)) return _referencePools[type].Count; else throw new UnityException($"获取引用数量失败,不存在引用池{type.FullName}!"); } /// /// 生成引用 /// /// /// public T Spawn() where T : class, IReference, new() { Type type = typeof(T); RegisterRefer(type); return _referencePools[type].Spawn(); } /// /// 回收引用 /// /// public void Recycle(T refer) where T : class, IReference, new() { Type type = refer.GetType(); RegisterRefer(type); _referencePools[type].Recycle(refer); } /// /// 批量回收引用 /// /// 引用类型 /// 引用集合 public void Recycles(List refes) where T : class, IReference, new() => Recycles(refes.ToArray()); /// /// 批量回收引用 /// /// 引用类型 /// 引用数组 public void Recycles(T[] refes) where T : class, IReference, new() { if (refes == null) return; Type type = typeof(T); RegisterRefer(type); for (int i = 0; i < refes.Length; i++) _referencePools[type].Recycle(refes[i]); } /// /// 清空指定引用池 /// /// 引用类型 public void Clear(Type type) => _referencePools[type].Clear(); /// /// 清空所有引用池 /// public void ClearAll() { foreach (var refer in _referencePools) refer.Value.Clear(); } /// /// 注册引用 /// /// 引用类型 private void RegisterRefer(Type type) { if (!_referencePools.ContainsKey(type)) _referencePools.Add(type, new ReferencePool(Limit)); } } }