不通过Object传递传输, 而是通过指定类型
    image.png

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.Events;
    5. // 空接口
    6. public interface IEventInfo { }
    7. public class EventInfo<T> : IEventInfo
    8. {
    9. public UnityAction<T> actions;
    10. public EventInfo(UnityAction<T> action)
    11. {
    12. actions += action;
    13. }
    14. }
    15. public class EventInfo: IEventInfo
    16. {
    17. public UnityAction actions;
    18. public EventInfo(UnityAction action)
    19. {
    20. actions += action;
    21. }
    22. }
    23. /// <summary>
    24. /// 事件中心 单例模式对象
    25. /// 1. Dictionary
    26. /// 2. 委托
    27. /// 3. 观察者设计模式
    28. /// 4. 泛型
    29. /// </summary>
    30. public class EventCenter : BaseManager<EventCenter>
    31. {
    32. // key - 事件的名字(比如: 怪物死亡, 玩家死亡, 通关 等等)
    33. // value - 对应的是 监听这个事件 对应的委托函数们
    34. private Dictionary<string, IEventInfo> eventDic = new Dictionary<string, IEventInfo>(); // 利用里氏替换原则
    35. /// <summary>
    36. /// 添加事件监听
    37. /// </summary>
    38. /// <param name="name">事件的名字</param>
    39. /// <param name="action">准备用来处理事件的委托函数</param>
    40. public void AddEventListener<T>(string name, UnityAction<T> action)
    41. {
    42. // 有没有对应的事件监听
    43. // 有的情况
    44. if (eventDic.ContainsKey(name))
    45. {
    46. (eventDic[name] as EventInfo<T>).actions += action;
    47. }
    48. // 没有的情况
    49. else
    50. {
    51. eventDic.Add(name, new EventInfo<T>(action));
    52. }
    53. }
    54. /// <summary>
    55. /// 监听不需要参数传递的事件
    56. /// </summary>
    57. /// <param name="name"></param>
    58. /// <param name="action"></param>
    59. public void AddEventListener(string name, UnityAction action)
    60. {
    61. // 有没有对应的事件监听
    62. // 有的情况
    63. if (eventDic.ContainsKey(name))
    64. {
    65. (eventDic[name] as EventInfo).actions += action;
    66. }
    67. // 没有的情况
    68. else
    69. {
    70. eventDic.Add(name, new EventInfo(action));
    71. }
    72. }
    73. /// <summary>
    74. /// 移除对应的事件监听
    75. /// </summary>
    76. /// <param name="name">事件的名字</param>
    77. /// <param name="action">对应之前添加的委托函数</param>
    78. public void RemoveEventListener<T>(string name, UnityAction<T> action)
    79. {
    80. if (eventDic.ContainsKey(name))
    81. (eventDic[name] as EventInfo<T>).actions -= action;
    82. }
    83. /// <summary>
    84. /// 移除不需要参数的事件
    85. /// </summary>
    86. /// <param name="name"></param>
    87. /// <param name="action"></param>
    88. public void RemoveEventListener(string name, UnityAction action)
    89. {
    90. if (eventDic.ContainsKey(name))
    91. (eventDic[name] as EventInfo).actions -= action;
    92. }
    93. /// <summary>
    94. /// 事件触发
    95. /// </summary>
    96. /// <param name="name">哪一个名字的事件触发</param>
    97. public void EventTrigger<T>(string name, T info)
    98. {
    99. if (eventDic.ContainsKey(name))
    100. {
    101. // 执行监听的所有函数
    102. if((eventDic[name] as EventInfo<T>).actions != null)
    103. (eventDic[name] as EventInfo<T>).actions.Invoke(info);
    104. //eventDic[name].Invoke(info);
    105. }
    106. // 不存在则什么都不用做
    107. }
    108. /// <summary>
    109. /// 触发不需要参数的事件
    110. /// </summary>
    111. /// <param name="name"></param>
    112. public void EventTrigger(string name)
    113. {
    114. if (eventDic.ContainsKey(name))
    115. {
    116. // 执行监听的所有函数
    117. if ((eventDic[name] as EventInfo).actions != null)
    118. (eventDic[name] as EventInfo).actions.Invoke();
    119. //eventDic[name].Invoke(info);
    120. }
    121. // 不存在则什么都不用做
    122. }
    123. /// <summary>
    124. /// 清空事件中心
    125. /// 主要用于场景切换时
    126. /// </summary>
    127. public void Clear()
    128. {
    129. eventDic.Clear();
    130. }
    131. }

    05 - 事件中心模块