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