EventCenter.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Events;
  5. namespace AdonFramework
  6. {
  7. /// <summary>
  8. /// 事件中心
  9. /// </summary>
  10. public class EventCenter : BaseManager<EventCenter>
  11. {
  12. /// <summary>
  13. /// 事件字典,存储注册事件
  14. /// </summary>
  15. private Dictionary<string, IEventInfo> EventDic = new Dictionary<string, IEventInfo>();
  16. /// <summary>
  17. /// 有参数注册事件
  18. /// </summary>
  19. /// <typeparam name="T">参数类型</typeparam>
  20. /// <param name="name"></param>
  21. /// <param name="action"></param>
  22. public void AddEventListener<T>(string name, UnityAction<T> action)
  23. {
  24. if (EventDic.ContainsKey(name))
  25. {
  26. (EventDic[name] as EventInfo<T>).action += action;
  27. }
  28. else
  29. {
  30. EventDic.Add(name, new EventInfo<T>(action));
  31. }
  32. }
  33. /// <summary>
  34. /// 注册事件
  35. /// </summary>
  36. /// <param name="name">事件名</param>
  37. /// <param name="action">事件执行函数</param>
  38. public void AddEventListener(string name, UnityAction action)
  39. {
  40. if (EventDic.ContainsKey(name))
  41. {
  42. (EventDic[name] as EventInfo).action += action;
  43. }
  44. else
  45. {
  46. EventDic.Add(name, new EventInfo(action));
  47. }
  48. }
  49. /// <summary>
  50. /// 移除监听事件
  51. /// 当注册对象销毁事调用(OnDestroy)
  52. /// </summary>
  53. /// <param name="name">事件名</param>
  54. /// <param name="action">对应的事件函数</param>
  55. public void RemoveEventListener<T>(string name,UnityAction<T> action)
  56. {
  57. if (EventDic.ContainsKey(name))
  58. (EventDic[name] as EventInfo<T>).action -= action;
  59. }
  60. /// <summary>
  61. /// 移除监听事件
  62. /// 当注册对象销毁事调用(OnDestroy)
  63. /// </summary>
  64. /// <param name="name">事件名</param>
  65. /// <param name="action">对应的事件函数</param>
  66. public void RemoveEventListener(string name, UnityAction action)
  67. {
  68. if (EventDic.ContainsKey(name))
  69. (EventDic[name] as EventInfo).action -= action;
  70. }
  71. /// <summary>
  72. /// 触发参数
  73. /// </summary>
  74. /// <param name="name">事件名</param>
  75. /// <param name="info">事件参数</param>
  76. public void EventTrigger<T>(string name , T info)
  77. {
  78. if (EventDic.ContainsKey(name))
  79. {
  80. if((EventDic[name] as EventInfo<T>).action != null)
  81. (EventDic[name] as EventInfo<T>).action.Invoke(info);
  82. }
  83. }
  84. /// <summary>
  85. /// 触发参数
  86. /// </summary>
  87. /// <param name="name">事件名</param>
  88. /// <param name="info">事件参数</param>
  89. public void EventTrigger(string name)
  90. {
  91. if (EventDic.ContainsKey(name))
  92. {
  93. if ((EventDic[name] as EventInfo).action != null)
  94. (EventDic[name] as EventInfo).action.Invoke();
  95. }
  96. }
  97. /// <summary>
  98. /// 清空
  99. /// 场景切换时调用
  100. /// </summary>
  101. public void Clear()
  102. {
  103. EventDic.Clear();
  104. }
  105. }
  106. /// <summary>
  107. /// 事件信息接口,解决传递参数装箱拆箱对性能损耗
  108. /// </summary>
  109. public interface IEventInfo
  110. {
  111. }
  112. /// <summary>
  113. /// 有参数事件信息类
  114. /// </summary>
  115. /// <typeparam name="T"></typeparam>
  116. public class EventInfo<T>:IEventInfo
  117. {
  118. public EventInfo(UnityAction<T> _action)
  119. {
  120. action += _action;
  121. }
  122. public UnityAction<T> action;
  123. }
  124. /// <summary>
  125. /// 无参数事件信息类
  126. /// </summary>
  127. public class EventInfo : IEventInfo
  128. {
  129. public EventInfo(UnityAction _action)
  130. {
  131. action += _action;
  132. }
  133. public UnityAction action;
  134. }
  135. }