На официальном сайте Unity есть видеоурок:
События: создание простой системы обмена сообщениями .
Они создают менеджер событий или систему обмена сообщениями.
Я смотрю это, и это было очень полезно, поэтому я создал эту систему в своей игре и теперь решил вместо использования UnityEvent
и UnityAction
использовать delegate
и event
, что является лучшей производительностью и хорошей практикой. Итак, вот мой код [StopListen()
функция еще не включена]:
public class EventManager : MonoBehaviour
{
public delegate void GameEvents();
public event GameEvents onGameEvent;
private static EventManager _instance = null;
public static EventManager Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType(typeof(EventManager)) as EventManager;
}
if(!_instance)
{
Debug.LogError("Put a GameObject with this scrip attach to it on your scene.");
}
else
{
_instance.InitializeEventDictionary();
}
return _instance;
}
}
private Dictionary eventsDictionary;
void InitializeEventDictionary()
{
if (eventsDictionary == null)
eventsDictionary = new Dictionary();
}
public void Listen(string eventName, GameEvents gameEvent)
{
GameEvents thisEvent = null;
if (Instance.eventsDictionary.TryGetValue(eventName, out gameEvent))
{
thisEvent += gameEvent;
}
else
{
thisEvent = new GameEvents();
thisEvent += gameEvent;
Instance.eventsDictionary.Add(eventName, thisEvent);
}
}
public void TriggerEvent(string eventName)
{
GameEvents thisEvent;
if(Instance.eventsDictionary.TryGetValue(eventName, out thisEvent))
thisEvent.Invoke();
}
}
В моей функции Listen()
эта строка thisEvent = new GameEvents();
доставляет мне неприятности, и я не знаю, как это исправить! (Помогите!): -)
[PS]:
-
delegate
и event
имеют лучшую производительность, чем UnityEvent
и UnityAction
?
- Что еще нужно или нужно добавить в этот код, чтобы сделать его более эффективным?