EventManager.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. /// <summary>
  5. /// 事件管理器
  6. /// </summary>
  7. public static class EventManager
  8. {
  9. private class PostWrapper
  10. {
  11. public int PostFrame;
  12. public int EventID;
  13. public IEventMessage Message;
  14. public void OnRelease()
  15. {
  16. PostFrame = 0;
  17. EventID = 0;
  18. Message = null;
  19. }
  20. }
  21. private static readonly Dictionary<int, List<Action<IEventMessage>>> _listeners = new Dictionary<int, List<Action<IEventMessage>>>(1000);
  22. private static readonly List<PostWrapper> _postWrappers = new List<PostWrapper>(1000);
  23. public static void Update()
  24. {
  25. for (int i = _postWrappers.Count - 1; i >= 0; i--)
  26. {
  27. var wrapper = _postWrappers[i];
  28. if (UnityEngine.Time.frameCount > wrapper.PostFrame)
  29. {
  30. SendMessage(wrapper.EventID, wrapper.Message);
  31. _postWrappers.RemoveAt(i);
  32. }
  33. }
  34. }
  35. /// <summary>
  36. /// 添加监听
  37. /// </summary>
  38. public static void AddListener<TEvent>(System.Action<IEventMessage> listener) where TEvent : IEventMessage
  39. {
  40. AddListener(typeof(TEvent), listener);
  41. }
  42. /// <summary>
  43. /// 添加监听
  44. /// </summary>
  45. public static void AddListener(System.Type eventType, System.Action<IEventMessage> listener)
  46. {
  47. int eventId = eventType.GetHashCode();
  48. AddListener(eventId, listener);
  49. }
  50. /// <summary>
  51. /// 添加监听
  52. /// </summary>
  53. public static void AddListener(int eventId, System.Action<IEventMessage> listener)
  54. {
  55. if (_listeners.ContainsKey(eventId) == false)
  56. _listeners.Add(eventId, new List<Action<IEventMessage>>());
  57. if (_listeners[eventId].Contains(listener) == false)
  58. _listeners[eventId].Add(listener);
  59. }
  60. /// <summary>
  61. /// 移除监听
  62. /// </summary>
  63. public static void RemoveListener<TEvent>(System.Action<IEventMessage> listener) where TEvent : IEventMessage
  64. {
  65. RemoveListener(typeof(TEvent), listener);
  66. }
  67. /// <summary>
  68. /// 移除监听
  69. /// </summary>
  70. public static void RemoveListener(System.Type eventType, System.Action<IEventMessage> listener)
  71. {
  72. int eventId = eventType.GetHashCode();
  73. RemoveListener(eventId, listener);
  74. }
  75. /// <summary>
  76. /// 移除监听
  77. /// </summary>
  78. public static void RemoveListener(int eventId, System.Action<IEventMessage> listener)
  79. {
  80. if (_listeners.ContainsKey(eventId))
  81. {
  82. if (_listeners[eventId].Contains(listener))
  83. _listeners[eventId].Remove(listener);
  84. }
  85. }
  86. /// <summary>
  87. /// 实时广播事件
  88. /// </summary>
  89. public static void SendMessage(IEventMessage message)
  90. {
  91. int eventId = message.GetType().GetHashCode();
  92. SendMessage(eventId, message);
  93. }
  94. /// <summary>
  95. /// 实时广播事件
  96. /// </summary>
  97. public static void SendMessage(int eventId, IEventMessage message)
  98. {
  99. if (_listeners.ContainsKey(eventId) == false)
  100. return;
  101. List<Action<IEventMessage>> listeners = _listeners[eventId];
  102. for (int i = listeners.Count - 1; i >= 0; i--)
  103. {
  104. listeners[i].Invoke(message);
  105. }
  106. }
  107. /// <summary>
  108. /// 延迟广播事件
  109. /// </summary>
  110. public static void PostMessage(IEventMessage message)
  111. {
  112. int eventId = message.GetType().GetHashCode();
  113. PostMessage(eventId, message);
  114. }
  115. /// <summary>
  116. /// 延迟广播事件
  117. /// </summary>
  118. public static void PostMessage(int eventId, IEventMessage message)
  119. {
  120. var wrapper = new PostWrapper();
  121. wrapper.PostFrame = UnityEngine.Time.frameCount;
  122. wrapper.EventID = eventId;
  123. wrapper.Message = message;
  124. _postWrappers.Add(wrapper);
  125. }
  126. /// <summary>
  127. /// 清空所有监听
  128. /// </summary>
  129. public static void ClearListeners()
  130. {
  131. foreach (int eventId in _listeners.Keys)
  132. {
  133. _listeners[eventId].Clear();
  134. }
  135. _listeners.Clear();
  136. }
  137. /// <summary>
  138. /// 获取监听者总数
  139. /// </summary>
  140. private static int GetAllListenerCount()
  141. {
  142. int count = 0;
  143. foreach (var list in _listeners)
  144. {
  145. count += list.Value.Count;
  146. }
  147. return count;
  148. }
  149. }