Также известен как шаблон издателя, или то, что я называю шаблоном событий.

Шаблон наблюдателя — это шаблон проектирования программного обеспечения, в котором объект, называемый subject, поддерживает список своих зависимых элементов, называемых наблюдателями и автоматически уведомляет их о любых изменениях состояния, обычно вызывая один из их методов.
Источник: Наблюдатель шаблон

Это помогает нам сохранять наши классы слабо связанными. Game Logic запустится, и когда произойдет событие, оно опубликует событие, и наблюдатели отреагируют на это событие. Подписчики ожидают, что это событие произойдет (Наблюдение). Game Logic публикует событие. Это один ко многим вид связи. У вас есть один класс издатель, который хочет отправить сообщение множеству разных наблюдателей, ему все равно, кто они и что они делают с событием. Это огонь и забыть. Это также помогает с принципом SOLID Open-closed, который после реализации легко расширяется (добавляя дополнительные поведения), но код не нужно изменять, чтобы добавить эти поведения.

Выполнение

У меня есть игра, в которой можно ПОВЫШАТЬ уровень. Когда уровень персонажа повышается, я хочу, чтобы частица играла, а персонаж сбрасывал свое текущее здоровье до полного здоровья.

Чтобы настроить сцену, у меня есть сценарий уровня, который управляет прокачкой персонажа, сценарий здоровья для управления здоровьем персонажа и сценарий отладчика для имитации пользовательского интерфейса. Для простоты и для тестирования Персонаж будет получать 10 очков опыта каждые 0,2 секунды, терять 2 очка здоровья каждую секунду, а скрипт отладчика будет отображать текущие очки опыта, текущий уровень и текущее здоровье. В реальной игре это было бы заменено реальной логикой игрового процесса с системой здоровья, системой уровней и соответствующим пользовательским интерфейсом для отображения всего этого.

В моей сцене у меня есть GameObject с компонентами Level, Health и Debugger, а также простая система частиц.

События Единства

Unity упрощает реализацию шаблона Observer с событиями Unity.

События Unity могут принимать до 4 аргументов, я показываю только использование 0 аргументов.



Постоянный обратный вызов с нулевым аргументом, который можно сохранить вместе со сценой.

Источник: Единство событий

Чтобы использовать это, все, что мне нужно сделать, это добавить событие Unity в мой сценарий уровня.

В Unity я добавляю на уровень событие, которое обращается к функции Play игрового объекта Particle System Component Particle System Component.

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

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

Теперь я могу сделать то же самое для сброса здоровья при срабатывании события Unity.

Теперь я могу легко добавить других наблюдателей, которые будут реагировать на повышение уровня персонажа, как настоящий пользовательский интерфейс.

Делегаты, акции и события

Теперь я не хочу добавлять событие Unity к каждому персонажу, у которого есть компонент здоровья, чтобы восстановить здоровье при повышении уровня персонажа. Я мог бы сделать событие Unity уровня Public и зарегистрировать метод Health Rest в сценарии Health. В C# есть еще один способ использования делегатов, действий и событий.

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





Теперь нам нужно вызвать событие при повышении уровня персонажа.

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

Лучшая практика использования событий в коде — регистрироваться в нем, когда сценарий включен, и отменять регистрацию, когда он отключен (нет необходимости запускать метод, когда он не нужен). Также это предотвратит ошибки, если наблюдатель будет уничтожен.

Теперь здоровье персонажа сбрасывается каждый раз, когда уровень повышается.

Я также могу использовать параметры с событиями.



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

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

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

Заключение

Шаблон Observer — полезный инструмент для любого программиста. Это помогает сохранить ваш код слабо связанным, а также реализовать принцип SOLID Open-closed. Вы можете использовать Unity Events или C# Delegates/Events или Actions, чтобы реализовать это в своем коде. Как вы это реализуете, зависит от ваших потребностей и того, чего вы хотите достичь.

Код можно найти в моем GIT Hub по адресу



GitHub — JamesLaFritz/Design-Patterns-For-Unity at ObserverPattern
Сообщить об ошибке · Функция запроса демонстрирует различные шаблоны проектирования программирования в Unity. Есть много разных…github.com»