🕹️UnityEvent
Автор: Дмитрий Прокопьев
Что такое UnityEvent?
UnityEvent?UnityEvent это класс Unity, который выполняет роль декоратора для стандартных событий. Это значит, что UnityEvent не является событием с точки зрения языка (так как не является делегатом). Вместо этого он содержит событие в себе и предоставляет публичный интерфейс для работы с ним. Говоря иначе, это класс-обертка для реальных событий.
Зачем был создан UnityEvent?
UnityEvent?Возникает вопрос, зачем он тогда нужен? Все дело в сериализации - механизме, позволяющем Unity отображать данные в инспекторе. Unity не может вытащить из обычных делегатов данные, которые ему нужно отобразить в инспекторе, сделать это технически почти невозможно. Поэтому при работе с инспектором ему требуется своя обертка.
Можно сделать вывод, что UnityEvent нужен только для работы с событиями через инспектор.
Как объявить UnityEvent?
UnityEvent?Продолжим разбирать пример с кошельком. Предположим, что после сохранения количества денег игроку необходимо показать иконку сохранения. Чтобы сделать это, нам потребуется запустить эффект после сохранения - это можно сделать через UnityEvent. Так как UnityEvent нужен для работы через инспектор, то и настраивать его мы будем в инспекторе:
[SerializeField] private UnityEvent _saved;Нет встроенных механизмов, которые могут инкапсулировать UnityEvent и сделать его безопасным для передачи из вне, поэтому его предпочтительно держать приватным. Если все таки требуется работать с ним из других компонентов, как это сделать рассказано здесь.
Синтаксис UnityEvent
UnityEventВызвать UnityEvent можно с помощью метода Invoke. Проверку на null в этом случае делать не требуется (так как не делегат), нужно только убедиться, что UnityEvent был инициализирован - он либо сериализованное поле, либо мы явно вызвали конструктор.
_saved.Invoke();Так как UnityEvent не является делегатом, к нему нельзя применить операторы += и -=. Вместо них в UnityEvent присутствуют методы AddListener и RemoveListener. В большинстве случаев мы настраиваем UnityEvent через инспектор
Last updated
Was this helpful?