Паттерн Observer, С#, unity, gamedev,

preview_player
Показать описание
Попробовал разжевать ключевые идеи и принципа паттерна Observer, а также показать его эволюцию.

Если будут вопросы
мой тг @wargy

Автору на кофе и шаурму
4276 5500 5792 8742 - карта Сбербанка

Тайминги:
00:00 Введение
01:00 Проблема уведомления классов
01:17 Конкретный пример: введение
02:13 Плохое решение №1: уведомляем классы через Update
03:04 Плохое решение №2: уведомляем через композицию
04:54 Паттерн Observer в картинках
06:16 Паттерн Observer в UML-схеме
07:19 Рефакторим наш Player под Observer
09:03 Рефакторим слушателей, HealthBar
10:03 UML-схема нашего кода
11:08 Observer в наши дни
13:15 Observer в других паттернах
14:40 Финал
Рекомендации по теме
Комментарии
Автор

Братан, хорош, давай, давай вперед! Контент в кайф, можно ещё? Вообще красавчик!

PaulZabelin
Автор

Сергей, спасибо! Материал востребованный, подача безупречная!
Скинул линк на ваш видос сокурсникам. Поржали с Лунтика.
Хотел бы увидеть столь же усвояемый материал по DIP в реализации Zenject
Ну и по остальным принципам SOLID в таком же стиле!
Спасибо от сообщества!

shlembert
Автор

Очень круто объясняете. Приятно слушать и смотреть, спасибо!

mikhail
Автор

Спасибо чел, я прям прозрел когда посмотрел твоё видео. У меня будето пазл в голове сложился. Спасибо!

vockinmine
Автор

12:06 Нынче вроде можно ивенты проверять на нуль одной строкой, вот так: Event?.Invoke()

COOKIEMONSTER
Автор

Классно, понятно, интересно, виртуозно

shelikhann
Автор

тупа лайк под каждым видео, по твоим видосам можно и мидлом стать

MrGg
Автор

8:54 Интерфейс, как и абстрактный класс, позволяет использовать protected.

ichbinschlange
Автор

Тут единственный вопрос в конце к методу UpdateUI у HealthBar. А не лучше его сделать приватным, чтобы только сам класс решал, когда и как он будет обновлять полоску здоровья? А то вдруг злой геймменеджер снаружи его ради прикола будет вызывать? Или есть какой-то смысл его оставить публичным?

lzehtkl
Автор

Кстати, очень бы не помешали примеры по разным паттернам, но не в ООП, а в Дата-ориентированном программировании в Юнити. Не планируется ли случайно такого в ближайшее время?

COOKIEMONSTER
Автор

Здравствуйте. Хотел задать вопрос. Насколько я понимаю функционал паттерна Observer как и использование событий в данном случае, можно заменить на реактивные свойства, которые реализованы в том же UniRx. Хотел спросить все ли правильно я понимаю.

Guy-qvbq
Автор

получается современная версия паттерна это просто action в классе object и подписка/отписка нужного метода от него в классе observer? никих интерфейсов, ничего. правильно?

vlpalamar
Автор

Сегодня бежал с работы домой, не успел добежать и на пол пути реализовал интерфейс АйОбсёрвер.
Шютка))

COOKIEMONSTER
Автор

Есть более удобный способ использования Наблюдателя без интерфейсов.

- Создаём класс события, являющимся ScriptableObject.
- Примерная реализация:



[CreateAssetMenu]
public class GameEvent : ScriptableObject
{
private List<Action> _listeners = new List<Action>();

public void Subscribe(Action newListener)
{
if
{
Debug.LogError($"Попытка повторного добавления {newListener} в список подписчиков события {name}.");
return;
}

_listeners.Add(newListener);
}

public void Unsubscribe(Action listener)
{
if
{
Debug.LogError($"Попытка удалить несуществующего подписчика {listener} из списка подписчиков события {name}.");
return;
}

_listeners.Remove(listener);
}

public void Publish()
{
if (_listeners.Count == 0)
{
Debug.LogError($"Попытка инициировать событие {name}, у которого нет подписчиков");
return;
}

for (int i = 0; i < _listeners.Count; i++)
_listeners[i].Invoke();
}
}



- Для каждого события создаём отдельный экземпляр с уникальным именем в ассетах.
- Ссылки на конкретный экземпляр должны быть у издателя и подписчика(ов).
- Издатель просто вызывает Publish() когда нужно. Подписчик просто передаёт метод в Subscribe([имя метода]), который должен обрабатывать событие.
- Для событий с аргументами можно расширить класс GameEvent<T>.

Это позволяет подписчикам знать только о событиях, игнорируя подробности о субъектах. Самому событию без разницы кто его публикует и обрабатывает.

dmitryzolkin