Advertisement
valik140201

Untitled

Mar 23rd, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.12 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic; // Дает доступ к дополнительным классам фреймворком Mono
  3. using UnityEngine;
  4.  
  5. // Синглтон Evenmanager для отправки событий получателям
  6. // Работает с реализацией IListener
  7. public class EventManager : MonoBehaviour
  8. {
  9. #region свойства C#
  10.  
  11. // Общий доступ к экземпляру
  12. public static EventManager Instance
  13. {
  14. get { return instance; }
  15. set {}
  16. }
  17. #endregion
  18.  
  19. #region переменные
  20. // Экземпляр диспечера событий (синглтон)
  21. private static EventManager instance = null;
  22.  
  23. // массив получателей (все зарегестрировавшейся объекты)
  24. // Dictionary - двумерный массивом особого типа
  25. // База данных в виде набора пар ключ - значение
  26. private Dictionary<EVENT_TYPE, List<IListener>> Listeners = new Dictionary<EVENT_TYPE, List<IListener>>();
  27. #endregion
  28.  
  29. #region методы
  30. private void Awake()
  31. {
  32. // Если экземпляр отсутствует, сохранить данные экземпляра
  33. if (instance == null)
  34. {
  35. instance = this;
  36. DontDestroyOnLoad(this);
  37. }
  38. else DestroyImmediate(this);
  39. }
  40.  
  41. /// <summary>
  42. /// Функция добавления получятеля в массив
  43. /// </summary>
  44. /// <param name="Event_Type">Событие, ожидаемое получателем</param>
  45. /// <param name="Listener">Объект, ожидающий события</param>
  46. public void AddListener(EVENT_TYPE Event_Type, IListener Listener)
  47. {
  48. // Список получателей для данного события
  49. List<IListener> ListenList = null;
  50.  
  51. // Проверить тип события. Если существует - добавить в список
  52. if(Listeners.TryGetValue(Event_Type, out ListenList))
  53. {
  54. // Список существует, добавить новый элемент
  55. ListenList.Add(Listener);
  56. return;
  57. }
  58.  
  59. // Иначе создать список как ключ словаря
  60. ListenList = new List<IListener>();
  61. ListenList.Add(Listener);
  62. Listeners.Add(Event_Type, ListenList);
  63. }
  64.  
  65. /// <summary>
  66. /// Посылает события получателю
  67. /// </summary>
  68. /// <param name="Event_Type">Событие для вызова</param>
  69. /// <param name="Sender">Вызываемый объект</param>
  70. /// <param name="Param">Необязательный аргумент</param>
  71. public void PostNotification(EVENT_TYPE Event_Type, Component Sender, Object Param = null)
  72. {
  73. // Посылать событие всем получателям
  74. // Список получателей только для данного события
  75. List<IListener> ListenList = null;
  76.  
  77. // Если получателей нет - выйти
  78. if (!Listeners.TryGetValue(Event_Type, out ListenList)) return;
  79.  
  80. // Получатель есть - послать им событие
  81. for (int i = 0; i < ListenList.Count; i++)
  82. {
  83. if (!ListenList[i].Equals(null)) ListenList[i].OnEvent(Event_Type, Sender, Param);
  84. }
  85. }
  86.  
  87. // Удаляет событие из словоря, включая всех получателей
  88. public void RemoveEvent(EVENT_TYPE Event_Type)
  89. {
  90. Listeners.Remove(Event_Type);
  91. }
  92.  
  93. // Удаляет все избытачные записи из словаря
  94. public void RemoveRedundancies()
  95. {
  96. // Создать новый словарь
  97. Dictionary<EVENT_TYPE, List<IListener>> TmpListeners = new Dictionary<EVENT_TYPE, List<IListener>>();
  98.  
  99. // обойти все записи в словаре
  100. foreach(KeyValuePair<EVENT_TYPE, List<IListener>> Item in Listeners)
  101. {
  102. // обойти всех получателей, удалить пустые ссылки
  103. for(int i = Item.Value.Count - 1; i > 0; i--)
  104. {
  105. // Если ссылка пустая, удалить элемент
  106. if (Item.Value[i].Equals(null)) Item.Value.RemoveAt(i);
  107. }
  108.  
  109. // Если в списке остались элементы, добавить его в словарь tmp
  110. if (Item.Value.Count > 0) TmpListeners.Add(Item.Key, Item.Value);
  111. }
  112.  
  113. // Заменить объект Listeners новым словарем
  114. Listeners = TmpListeners;
  115.  
  116. // Вызывается при смене сцены. Очищает словарь
  117. void OnLevelWasLoaded()
  118. {
  119. RemoveRedundancies();
  120. }
  121. #endregion
  122. }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement