Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic; // Дает доступ к дополнительным классам фреймворком Mono
- using UnityEngine;
- // Синглтон Evenmanager для отправки событий получателям
- // Работает с реализацией IListener
- public class EventManager : MonoBehaviour
- {
- #region свойства C#
- // Общий доступ к экземпляру
- public static EventManager Instance
- {
- get { return instance; }
- set {}
- }
- #endregion
- #region переменные
- // Экземпляр диспечера событий (синглтон)
- private static EventManager instance = null;
- // массив получателей (все зарегестрировавшейся объекты)
- // Dictionary - двумерный массивом особого типа
- // База данных в виде набора пар ключ - значение
- private Dictionary<EVENT_TYPE, List<IListener>> Listeners = new Dictionary<EVENT_TYPE, List<IListener>>();
- #endregion
- #region методы
- private void Awake()
- {
- // Если экземпляр отсутствует, сохранить данные экземпляра
- if (instance == null)
- {
- instance = this;
- DontDestroyOnLoad(this);
- }
- else DestroyImmediate(this);
- }
- /// <summary>
- /// Функция добавления получятеля в массив
- /// </summary>
- /// <param name="Event_Type">Событие, ожидаемое получателем</param>
- /// <param name="Listener">Объект, ожидающий события</param>
- public void AddListener(EVENT_TYPE Event_Type, IListener Listener)
- {
- // Список получателей для данного события
- List<IListener> ListenList = null;
- // Проверить тип события. Если существует - добавить в список
- if(Listeners.TryGetValue(Event_Type, out ListenList))
- {
- // Список существует, добавить новый элемент
- ListenList.Add(Listener);
- return;
- }
- // Иначе создать список как ключ словаря
- ListenList = new List<IListener>();
- ListenList.Add(Listener);
- Listeners.Add(Event_Type, ListenList);
- }
- /// <summary>
- /// Посылает события получателю
- /// </summary>
- /// <param name="Event_Type">Событие для вызова</param>
- /// <param name="Sender">Вызываемый объект</param>
- /// <param name="Param">Необязательный аргумент</param>
- public void PostNotification(EVENT_TYPE Event_Type, Component Sender, Object Param = null)
- {
- // Посылать событие всем получателям
- // Список получателей только для данного события
- List<IListener> ListenList = null;
- // Если получателей нет - выйти
- if (!Listeners.TryGetValue(Event_Type, out ListenList)) return;
- // Получатель есть - послать им событие
- for (int i = 0; i < ListenList.Count; i++)
- {
- if (!ListenList[i].Equals(null)) ListenList[i].OnEvent(Event_Type, Sender, Param);
- }
- }
- // Удаляет событие из словоря, включая всех получателей
- public void RemoveEvent(EVENT_TYPE Event_Type)
- {
- Listeners.Remove(Event_Type);
- }
- // Удаляет все избытачные записи из словаря
- public void RemoveRedundancies()
- {
- // Создать новый словарь
- Dictionary<EVENT_TYPE, List<IListener>> TmpListeners = new Dictionary<EVENT_TYPE, List<IListener>>();
- // обойти все записи в словаре
- foreach(KeyValuePair<EVENT_TYPE, List<IListener>> Item in Listeners)
- {
- // обойти всех получателей, удалить пустые ссылки
- for(int i = Item.Value.Count - 1; i > 0; i--)
- {
- // Если ссылка пустая, удалить элемент
- if (Item.Value[i].Equals(null)) Item.Value.RemoveAt(i);
- }
- // Если в списке остались элементы, добавить его в словарь tmp
- if (Item.Value.Count > 0) TmpListeners.Add(Item.Key, Item.Value);
- }
- // Заменить объект Listeners новым словарем
- Listeners = TmpListeners;
- // Вызывается при смене сцены. Очищает словарь
- void OnLevelWasLoaded()
- {
- RemoveRedundancies();
- }
- #endregion
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement