# UnityEvent

## Что такое `UnityEvent`?

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

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

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

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

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

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

```csharp
[SerializeField] private UnityEvent _saved;
```

Нет встроенных механизмов, которые могут инкапсулировать `UnityEvent` и сделать его безопасным для передачи из вне, поэтому его предпочтительно держать приватным. Если все таки требуется работать с ним из других компонентов, как это сделать рассказано [здесь](https://ijunior-knowledge-base.gitbook.io/baza-znanii-yayunior/unity/sobytiya/sovmeshenie-sobytii).

## Синтаксис `UnityEvent`

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

```csharp
_saved.Invoke();
```

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