当前位置:   article > 正文

Unity组件开发--事件管理器_unity 事件管理器

unity 事件管理器

1.创建单例脚本:SingletonBase

  1. public class SingletonBase<T> where T : new()
  2. {
  3. private static T instance;
  4. // 多线程安全机制
  5. private static readonly object locker = new object();
  6. public static T Instance
  7. {
  8. get
  9. {
  10. if (instance == null)
  11. {
  12. //lock写第一个if里是因为只有该类的实例还没创建时,才需要加锁,这样可以节省性能
  13. lock (locker)
  14. {
  15. if (instance == null)
  16. instance = new T();
  17. }
  18. }
  19. return instance;
  20. }
  21. }
  22. }

2.事件管理器单例脚本:EventManager 

  1. using System.Collections.Generic;
  2. using System;
  3. using System.Diagnostics;
  4. using UnityEngine.Device;
  5. /// <summary>
  6. /// 便于触发事件的扩展类
  7. /// </summary>
  8. public static class EventTriggerExt
  9. {
  10. /// <summary>
  11. /// 触发事件(无参数)
  12. /// </summary>
  13. /// <param name="sender">触发源</param>
  14. /// <param name="eventName">事件名</param>
  15. public static void TriggerEvent(this object sender, string eventName)
  16. {
  17. EventManager.Instance.TriggerEvent(eventName, sender,null);
  18. }
  19. /// <summary>
  20. /// 触发事件(有参数)
  21. /// </summary>
  22. /// <param name="sender">触发源</param>
  23. /// <param name="eventName">事件名</param>
  24. /// <param name="args">事件参数</param>
  25. public static void TriggerEvent(this object sender, string eventName, EventArgs args)
  26. {
  27. EventManager.Instance.TriggerEvent(eventName, sender, args);
  28. }
  29. }
  30. /// <summary>
  31. /// 事件管理器
  32. /// </summary>
  33. public class EventManager : SingletonBase<EventManager>
  34. {
  35. private Dictionary<string, EventHandler> handlerDic = new Dictionary<string, EventHandler>();
  36. /// <summary>
  37. /// 添加一个事件的监听者
  38. /// </summary>
  39. /// <param name="eventName">事件名</param>
  40. /// <param name="handler">事件处理函数</param>
  41. public void AddListener(string eventName, EventHandler handler)
  42. {
  43. if (handlerDic.ContainsKey(eventName))
  44. handlerDic[eventName] += handler;
  45. else
  46. handlerDic.Add(eventName, handler);
  47. }
  48. /// <summary>
  49. /// 移除一个事件的监听者
  50. /// </summary>
  51. /// <param name="eventName">事件名</param>
  52. /// <param name="handler">事件处理函数</param>
  53. public void RemoveListener(string eventName, EventHandler handler)
  54. {
  55. if (handlerDic.ContainsKey(eventName))
  56. handlerDic[eventName] -= handler;
  57. }
  58. /// <summary>
  59. /// 触发事件 无senser
  60. /// </summary>
  61. /// <param name="eventName"></param>
  62. /// <param name="args"></param>
  63. public void TriggerEvent(string eventName, EventArgs args)
  64. {
  65. TriggerEvent(eventName, null, args);
  66. }
  67. /// <summary>
  68. /// 触发事件(有参数)
  69. /// </summary>
  70. /// <param name="eventName">事件名</param>
  71. /// <param name="sender">触发源</param>
  72. /// <param name="args">事件参数</param>
  73. public void TriggerEvent(string eventName, object sender, EventArgs args)
  74. {
  75. if (!Application.isPlaying) {
  76. return;
  77. }
  78. UnityEngine.Debug.Log("TriggerEvent:"+ eventName);
  79. #if UNITY_EDITOR
  80. if (handlerDic.ContainsKey(eventName))
  81. handlerDic[eventName]?.Invoke(sender, args);
  82. #else
  83. try {
  84. if (handlerDic.ContainsKey(eventName))
  85. handlerDic[eventName]?.Invoke(sender, args);
  86. }
  87. catch (Exception e) {
  88. UnityEngine.Debug.LogError(e.Message + "\n" + e.StackTrace);
  89. }
  90. #endif
  91. }
  92. /// <summary>
  93. /// 清空所有事件
  94. /// </summary>
  95. public void Clear()
  96. {
  97. handlerDic.Clear();
  98. }
  99. }

3.事件名称定义脚本:EventName

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public static class EventName
  5. {
  6. public const string SocketOpen = nameof(SocketOpen);
  7. }

4.事件回调参数脚本:CustomEventArgs

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UTNET;
  6. using agora_gaming_rtc;
  7. using UnityEngine.Events;
  8. //将所有的事件参数类统一写在这个脚本
  9. public class LightColorChangeEventArgs : EventArgs
  10. {
  11. public float red;
  12. public float green;
  13. public float blue;
  14. }

5.如何使用:

  1. EventManager.Instance.AddListener(EventName.OnSceneLoaded, (s, e) => { //场景未加载之前,不让玩家操作
  2. enabled = true;
  3. });
EventManager.Instance.AddListener(EventName.ChangeAngle, changeAngle);
this.TriggerEvent(EventName.ChangeAngle, new AngleChangeEventArgs { angleIndex = 3 });

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/865605
推荐阅读
相关标签
  

闽ICP备14008679号