Создайте Event Manager (Система обмена сообщениями) в Unity Используя делегат и событие - PullRequest
0 голосов
/ 29 октября 2018

На официальном сайте 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]:

  1. delegate и event имеют лучшую производительность, чем UnityEvent и UnityAction?
  2. Что еще нужно или нужно добавить в этот код, чтобы сделать его более эффективным?

1 Ответ

0 голосов
/ 29 октября 2018

Вы должны определить, что должно вызываться при обращении к делегату, в противном случае, если ничего не нужно делать, делегат не нужен.

Как лямда:

thisEvent = new GameEvents(() => { Console.WriteLine("TODO");});

Или метод:

thisEvent = new GameEvents(Target);
private void Target()
{
     throw new NotImplementedException();
}

можно взглянуть на https://www.codeproject.com/Articles/624575/Delegate-Tutorial-for-Beginners

Что касается времени выполнения, я думаю, лучше всего сделать тест и посмотреть, что работает лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...