using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace TFramework { public class EditorReferencePool { private static Dictionary> _referencePools = new Dictionary>(); /// /// 获取引用数量 /// /// 引用类型 /// 引用数量 public static int GetRerenceCount(Type type) { if (_referencePools.ContainsKey(type)) return _referencePools[type].Count; else throw new UnityException($"获取引用数量失败,不存在引用池{type.FullName}!"); } /// /// 生成引用 /// /// /// public static T Spawn() where T : class, IReference, new() { Type type = typeof(T); RegisterRefer(type); T obj = null; if (GetRerenceCount(type) > 0) { obj = _referencePools[type][0] as T; _referencePools[type].Remove(obj); } else obj = new T(); return obj; } /// /// 生成指定条件引用 /// /// /// /// public static T Spawn(Predicate predicate) where T : class, IReference, new() { Type type = typeof(T); RegisterRefer(type); T obj = null; if (GetRerenceCount(type) > 0) { IReference reference = _referencePools[type].Find(p=>(bool)predicate?.Invoke(p as T)); if(reference!=null) { obj = reference as T; _referencePools[type].Remove(reference); } else obj = new T(); } else obj = new T(); return obj; } /// /// 回收引用 /// /// public static void Recycle(T refer) where T : class, IReference, new() { Type type = refer.GetType(); RegisterRefer(type); _referencePools[type].Add(refer); } /// /// 批量回收引用 /// /// 引用类型 /// 引用集合 public static void Recycles(List refes) where T : class, IReference, new() => Recycles(refes.ToArray()); /// /// 批量回收引用 /// /// 引用类型 /// 引用数组 public static 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].Add(refes[i]); } /// /// 清空指定引用池 /// /// 引用类型 public static void Clear(Type type) => _referencePools[type].Clear(); /// /// 清空所有引用池 /// public static void ClearAll() { foreach (var refer in _referencePools) refer.Value.Clear(); } /// /// 注册引用 /// /// 引用类型 private static void RegisterRefer(Type type) { if (!_referencePools.ContainsKey(type)) _referencePools.Add(type, new List()); } } }