Unity 框架

EditorReferencePool.cs 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace TFramework
  6. {
  7. public class EditorReferencePool
  8. {
  9. private static Dictionary<Type, List<IReference>> _referencePools = new Dictionary<Type, List<IReference>>();
  10. /// <summary>
  11. /// 获取引用数量
  12. /// </summary>
  13. /// <param name="type">引用类型</param>
  14. /// <returns>引用数量</returns>
  15. public static int GetRerenceCount(Type type)
  16. {
  17. if (_referencePools.ContainsKey(type))
  18. return _referencePools[type].Count;
  19. else
  20. throw new UnityException($"获取引用数量失败,不存在引用池{type.FullName}!");
  21. }
  22. /// <summary>
  23. /// 生成引用
  24. /// </summary>
  25. /// <typeparam name="T"></typeparam>
  26. /// <returns></returns>
  27. public static T Spawn<T>() where T : class, IReference, new()
  28. {
  29. Type type = typeof(T);
  30. RegisterRefer(type);
  31. T obj = null;
  32. if (GetRerenceCount(type) > 0)
  33. {
  34. obj = _referencePools[type][0] as T;
  35. _referencePools[type].Remove(obj);
  36. }
  37. else
  38. obj = new T();
  39. return obj;
  40. }
  41. /// <summary>
  42. /// 生成指定条件引用
  43. /// </summary>
  44. /// <typeparam name="T"></typeparam>
  45. /// <param name="predicate"></param>
  46. /// <returns></returns>
  47. public static T Spawn<T>(Predicate<T> predicate) where T : class, IReference, new()
  48. {
  49. Type type = typeof(T);
  50. RegisterRefer(type);
  51. T obj = null;
  52. if (GetRerenceCount(type) > 0)
  53. {
  54. IReference reference = _referencePools[type].Find(p=>(bool)predicate?.Invoke(p as T));
  55. if(reference!=null)
  56. {
  57. obj = reference as T;
  58. _referencePools[type].Remove(reference);
  59. }
  60. else
  61. obj = new T();
  62. }
  63. else
  64. obj = new T();
  65. return obj;
  66. }
  67. /// <summary>
  68. /// 回收引用
  69. /// </summary>
  70. /// <typeparam name="T"></typeparam>
  71. public static void Recycle<T>(T refer) where T : class, IReference, new()
  72. {
  73. Type type = refer.GetType();
  74. RegisterRefer(type);
  75. _referencePools[type].Add(refer);
  76. }
  77. /// <summary>
  78. /// 批量回收引用
  79. /// </summary>
  80. /// <typeparam name="T">引用类型</typeparam>
  81. /// <param name="refes">引用集合</param>
  82. public static void Recycles<T>(List<T> refes) where T : class, IReference, new() => Recycles<T>(refes.ToArray());
  83. /// <summary>
  84. /// 批量回收引用
  85. /// </summary>
  86. /// <typeparam name="T">引用类型</typeparam>
  87. /// <param name="refes">引用数组</param>
  88. public static void Recycles<T>(T[] refes) where T : class, IReference, new()
  89. {
  90. if (refes == null) return;
  91. Type type = typeof(T);
  92. RegisterRefer(type);
  93. for (int i = 0; i < refes.Length; i++)
  94. _referencePools[type].Add(refes[i]);
  95. }
  96. /// <summary>
  97. /// 清空指定引用池
  98. /// </summary>
  99. /// <param name="type">引用类型</param>
  100. public static void Clear(Type type) => _referencePools[type].Clear();
  101. /// <summary>
  102. /// 清空所有引用池
  103. /// </summary>
  104. public static void ClearAll()
  105. {
  106. foreach (var refer in _referencePools)
  107. refer.Value.Clear();
  108. }
  109. /// <summary>
  110. /// 注册引用
  111. /// </summary>
  112. /// <param name="type">引用类型</param>
  113. private static void RegisterRefer(Type type)
  114. {
  115. if (!_referencePools.ContainsKey(type))
  116. _referencePools.Add(type, new List<IReference>());
  117. }
  118. }
  119. }