🕹️UnityEvent

Автор: Дмитрий Прокопьев

Что такое UnityEvent?

UnityEvent это класс Unity, который выполняет роль декоратора для стандартных событий. Это значит, что UnityEvent не является событием с точки зрения языка (так как не является делегатом). Вместо этого он содержит событие в себе и предоставляет публичный интерфейс для работы с ним. Говоря иначе, это класс-обертка для реальных событий.

Зачем был создан UnityEvent?

Возникает вопрос, зачем он тогда нужен? Все дело в сериализации - механизме, позволяющем Unity отображать данные в инспекторе. Unity не может вытащить из обычных делегатов данные, которые ему нужно отобразить в инспекторе, сделать это технически почти невозможно. Поэтому при работе с инспектором ему требуется своя обертка.

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

Как объявить UnityEvent?

Продолжим разбирать пример с кошельком. Предположим, что после сохранения количества денег игроку необходимо показать иконку сохранения. Чтобы сделать это, нам потребуется запустить эффект после сохранения - это можно сделать через UnityEvent. Так как UnityEvent нужен для работы через инспектор, то и настраивать его мы будем в инспекторе:

[SerializeField] private UnityEvent _saved;

Нет встроенных механизмов, которые могут инкапсулировать UnityEvent и сделать его безопасным для передачи из вне, поэтому его предпочтительно держать приватным. Если все таки требуется работать с ним из других компонентов, как это сделать рассказано здесь.

Синтаксис UnityEvent

Вызвать UnityEvent можно с помощью метода Invoke. Проверку на null в этом случае делать не требуется (так как не делегат), нужно только убедиться, что UnityEvent был инициализирован - он либо сериализованное поле, либо мы явно вызвали конструктор.

_saved.Invoke();

Так как UnityEvent не является делегатом, к нему нельзя применить операторы += и -=. Вместо них в UnityEvent присутствуют методы AddListener и RemoveListener. В большинстве случаев мы настраиваем UnityEvent через инспектор

Last updated

Was this helpful?