Unity Event Manager с параметрами
Обновлено 4.12.2017
Немного обновил этот пример — теперь в параметры и их количество могут быть любыми
В уроках по Unity на официальном сайте, есть пример простого менеджера событий. Он работает и подойдет для простых взаимодействий. Но скорее всего, чтобы сократить количество событий и лучше структурировать код — нужно будет вызывать и слушать события с параметрами.
Модернизируем немного пример с сайта:
using UnityEngine;
using UnityEngine.Events;
using System.Collections;
using System.Collections.Generic;
using System;
public class EventManager : MonoBehaviour {
[Serializable]
public class GameEvent : UnityEvent <string> {}; // Наше новое событие с параметром
private static EventManager _eventManager;
private Dictionary <string, GameEvent> _eventDictionary;
public static EventManager instance {
get {
if (!_eventManager) {
_eventManager = FindObjectOfType (typeof (EventManager)) as EventManager;
if (!_eventManager)
Debug.LogError ("There needs to be one active EventManger...");
else
_eventManager.Init ();
}
return _eventManager;
}
}
void Init () {
if (_eventDictionary == null)
_eventDictionary = new Dictionary<string, GameEvent>();
}
public static void StartListening (string eventName, UnityAction <string> listener) {
GameEvent thisEvent = null;
if (instance._eventDictionary.TryGetValue (eventName, out thisEvent))
thisEvent.AddListener (listener);
else {
thisEvent = new GameEvent ();
thisEvent.AddListener (listener);
instance._eventDictionary.Add (eventName, thisEvent);
}
}
public static void StopListening (string eventName, UnityAction <string> listener) {
if (_eventManager == null)
return;
GameEvent thisEvent = null;
if (instance._eventDictionary.TryGetValue (eventName, out thisEvent))
thisEvent.RemoveListener (listener);
}
public static void SendEvent (string eventName, string param = null) {
GameEvent thisEvent = null;
if (instance._eventDictionary.TryGetValue (eventName, out thisEvent))
thisEvent.Invoke (param); // Вызов и передача параметра
}
}
Вместо UnityEvent будем работать с GameEvent у которого теперь есть string. Таким же образом преобразуем UnityAction и функцию вызова события.
Пример использования такой же:
void OnEnable () {
EventManager.StartListening ("event_name", MyFunction);
}
void OnDisable () {
EventManager.StopListening ("event_name", MyFunction);
}
void MyFunction (string param) {
Debug.Log (param); // переданный параметр
}
...
EventManager.SendEvent ("event_name", "param_string"); // вызов события
Собственно, параметров можно сделать несколько и других типов, всё зависит от потребностей.