Паттерн EventBus или Шина Событий в Unity

  Рет қаралды 4,013

Лавка Разработчика

Лавка Разработчика

Күн бұрын

Пікірлер: 43
@DeadRabbitCanDance
@DeadRabbitCanDance 2 ай бұрын
Я не понимаю, почему EventBus создается в самом объекте EventBusExample. Это как-то совсем не логично мне кажется.
@gamedevlavka
@gamedevlavka 2 ай бұрын
Так это ж просто для примера
@qma2275
@qma2275 5 ай бұрын
- Раз уж тут люди говорят о болячках паттерна, то стоит упомянуть решение - просто создать дополнительный слой абстракции, который отнимет у подсистем работу подписки и возьмёт её на себя. Вуаля, код стал независемее, но труднее для понимания. Какое из зол меньшее, пускай уже каждый решит сам
@gamedevlavka
@gamedevlavka 5 ай бұрын
Все верно!
@mypaxa003
@mypaxa003 5 ай бұрын
Блин. Не могу обьяснить почему, но есть странно ощущение, что это не самая хорошая практика... Но может это и не так.
@andrey_aka_skif
@andrey_aka_skif 5 ай бұрын
Имеем god-object, о котором все знают и от которого все зависят. Т.е. ни о какой изоляции компонентов уже речи не идет. Возможно, имеет смысл создать условно "шину", которая сама будет подписываться на события компонентов-источников и дергать методы компонентов-подписчиков. Тоже спагетти, но хоть сами компоненты не будут зависеть от шины. Здесь хоть и интерфейс, но это всё равно зависимость, которая не всегда нужна.
@titanovsky
@titanovsky 5 ай бұрын
@@andrey_aka_skif в божественных объектах не плохие сами по себе. Антипаттерн может спокойно быть паттерном, как и паттерн в определённых ситуациях может стать антипаттерном.
@gamedevlavka
@gamedevlavka 5 ай бұрын
Это полухак. То есть вроде и паттерн, но если можно обойтись без него - лучше обойтись без него. Мы оцениваем такие вещи на реальных проектах, нельзя заранее сказать, плохой паттерн или не плохой. Знай, что он есть, как можно применить, и однажды, когда тебе скажут сделать игру за 1.5 дня, ты его вспомнишь, вы вместе всплакнете, и сделаете игру в срок
@servalstar
@servalstar 5 ай бұрын
Так и есть, потом не распутаешь все эти связи между десятками и сотнями триггеров и подписчиков.
@andrey_aka_skif
@andrey_aka_skif 5 ай бұрын
@@titanovsky человек размышлял о минусах подхода. Я продолжил мысль. Сам подход шины событий используется часто. В тех же микросервисах. Хоть это и не прямой аналог.
@Barlog2012
@Barlog2012 Ай бұрын
Спасибо. В чём разница с брокером сообщений, сходу не соображу.
@muggzzzzz
@muggzzzzz 5 ай бұрын
Просматривается некоторая параллель с системой сигналов и слотов в Qt. Только в Qt нет никакой централизации обработки этих сигналов, кто угодно может их испускать и кто угодно ловить (главное прописать кто на что и как должен реагировать). В итоге вся программа может быть насквозь пронизана этими связями, и если проект достаточно большой, в нем становится очень тяжело ориентироваться.
@andrey_aka_skif
@andrey_aka_skif 5 ай бұрын
Чай заваривать не буду. Надеюсь, под макароны с котлетой тоже зайдет.
@titanovsky
@titanovsky 5 ай бұрын
Спасибо за видос, я что-то похожее делал, но систему назвал Hook.
@TheZaharovAndrey
@TheZaharovAndrey 5 ай бұрын
Полезные видосы у тебя, спасибо за работу. Хотелось бы ещё послушать про визуал в юнити: шейдеры, слои отображения, канвасы, работа с камерой, свет в 2d и 3d, создание UI. Наверняка, у тебя есть чем поделиться в этой области.
@СлаваДобровольский-ъ3з
@СлаваДобровольский-ъ3з 4 ай бұрын
Отличный паттерн, идея плавала на поверхности, но самостоятельно в голову не пришла. Большое спасибо.
@Likipufenger
@Likipufenger 5 ай бұрын
Геймдев который мы заслужили. Спасибо большое ❤
@CTePeoTun
@CTePeoTun 5 ай бұрын
Таким образом можно и тригеры в интерфейс выделить. Но в целом, есть ощущение, что если используется такая шина, то где-то что-то плохо спроектировано.
@ichbinschlange
@ichbinschlange 5 ай бұрын
Любой паттерн хорош или плох применением. В совсем маленьком проетке шина будет лишней, большой она превратит в спагетти, а для чего-нибудь среднего - как раз. Плюс шины событий в том, что она экономит время разработчика, если тот знает где её применять. В итоге можно не морочить голову сложными связями, а сделать по-простому и всё будет прекрасно работать.
@gamedevlavka
@gamedevlavka 5 ай бұрын
@@ichbinschlange все правильно, любое решение - это трата ресурсов, и тому, кто эти ресурсы выделяет (человеко-часы = деньги) решать, какой вариант будет оптимальным)
@cmep4359
@cmep4359 5 ай бұрын
​@@ichbinschlange А что можно использовать в том же маленьком проекте для событий? Не подскажете? :с
@ichbinschlange
@ichbinschlange 5 ай бұрын
@@cmep4359, всё строго индивидуально. Если проект учебный и опыта работы с шиной нет - отличный повод его получить, если проект совсем маленький и подразумевактся, что так и останется - просто покинуть всё нужное через конструкторы и вообще голову не забивать. Ещё можно в сторону ServiceLocator посмотреть, в контексте безопасности это тоже самое, но код писать проще, ибо не нужно постоянно лезть в God-object с эвентами. Вообще разных решений миллион, но они, в основном, избыточный для маленьких проектов.
@StratoCatster
@StratoCatster 5 ай бұрын
​@@cmep4359 Можно попробовать использовать паттерн медиатор
@Bedlamikus
@Bedlamikus 5 ай бұрын
Делаю что то похожее и есть проблема, в определенный момент не можешь придумать название нового евента на похожие по имени (но разные по функционалу) события в игре 😂 не плохо было бы затолкать в какой нибудь дикшинари эти евенты и по имени их вытаскивать. Получится динамическая шина в которой можно регистрировать евенты и нужные ребята по имени смогут туда подписаться и посматривать изменения, будь то квест на сбор определенных предметов на время или ui очки подсчитывает, или инвентарь смотрит что потратили и тд. И вся красота в том что если евента нет в шине то сущность просто живет и ни чего не делает, потому как не подписалась. Тут и модульность любимая и зависимости отвалятся. И интерфейс с ридонли тоже пригодиться. Но списочек с именами квестов придется где то держать в табличке, что бы через недели две не забыть что нарегистрировал 😂
@gamedevlavka
@gamedevlavka 5 ай бұрын
Да, можно и так! Мы говорим про идею, про паттерн, тонкости - дело наживное) Можно сделать динамическим на словаре, правда тогда и наименования событий надо хранить где-то в статике, чтобы память не потекла ручьем)
@derikfant831
@derikfant831 5 ай бұрын
Ооо, спасибо за еду) будем разбираться. Лайк!
@DekovirDekovir-is7wd
@DekovirDekovir-is7wd 5 ай бұрын
Спасибо за видео. Надеюсь постепенно начну применять
@ravenempty3562
@ravenempty3562 5 ай бұрын
Не ожидал, что будет понятно с первого просмотра. Спасибо, очень хорошо объяснил идею)
@inioning9313
@inioning9313 5 ай бұрын
Ооо новое видео
@nepochat
@nepochat 5 ай бұрын
Спасибо
@recstazy
@recstazy 5 ай бұрын
Это все хорошо до момента, когда тебе нужно добавить яблоко в инвентарь в UI четко после анимации его собирания, а вот добавить в модель и отправить аналитику сразу по клику) представляю, сколько там будет ивентов на это яблоко, а еще в какой спагетти коллбэк хэлл это все превратится, если добавится, условное диалоговое окно в этом процессе или что-то типа того))
@gamedevlavka
@gamedevlavka 5 ай бұрын
Такое в EventBus в принципе не должно попадать) я имею ввиду мешанину в виде секвенций визуала, там это просто не нужно)
@recstazy
@recstazy 4 ай бұрын
Вроде бы и да, но не понятно, а где вообще это должно использоваться) тут теряется вообще ответственность, все могут делать всё. + Появляются рэйс кондишны, потому что если на ивент будет более одного подписчика - в какой-то момент они поменяются местами и все полетит. Т.е. контроля над исполнением тоже нет. Я в этом паттерне вижу только рассадник багов) либо нужно будет на каждый чих наделать ивентов и контролировать, в каком порядке это все происходит. + Ещё добавьте сюда асинхронные IO операции, которые тоже могут начаться по одному из таких вот триггеров, в итоге тот, кто ивент этот вызвал никогда не узнает, закончилась ли размазанная по времени асинхронная фигня, которую кто-то та где-то написал) начнут писать WaitDelay(1s) и все такое))
@KanalSinyaKlashka
@KanalSinyaKlashka 5 ай бұрын
я хоть и учусь еще, но и без комментаторов заметил, что в этом подходе что-то не так, особенно в моменте, когда любой может дать и любой может взять) в любом случае было бы очень здорово, если бы автор уделял хотя бы минуту разбора на то, когда стоит применять, а когда нет(сугубо по опыту и для общих случаев, понятное дело, что все равно это все индивидуально)
@alexsklyarov6792
@alexsklyarov6792 5 ай бұрын
Обычно event bus как-то глобально используют, и хочется увидеть реализацию, где можно из любого класса триггернуть и подписаться, без монобехов. В том смысле что bus один и все через него работают, типа zenject event bus. Данный пример интересен, но практически не очень полезен, тема, как мне кажется не раскрыта))), но автору виднее...
@ggvv7785
@ggvv7785 5 ай бұрын
Объясню как я понял , если у нас есть множество объектов на одном уровне, то есть они не на уровень выше и в следствие этого не должны знать друг о друге то ивентбас служит промежуточной связью между ними , что помогает не переплетать их тем самым руша архитектуру
@zimadozgh
@zimadozgh 5 ай бұрын
Сорян, бро, но я нихера не понял. Но спасибо в любом случае, попробую разобраться
@andrey_aka_skif
@andrey_aka_skif 5 ай бұрын
Что за цензура на 6:26?
@gamedevlavka
@gamedevlavka 5 ай бұрын
оО, интересно, интересно! Это не часть монтажа, если что
@Dmittry
@Dmittry 5 ай бұрын
Ютуб заблюрил плохой код. Такое на ютубе нельзя показывать.
when you have plan B 😂
00:11
Andrey Grechka
Рет қаралды 67 МЛН
GIANT Gummy Worm Pt.6 #shorts
00:46
Mr DegrEE
Рет қаралды 105 МЛН
#пилимигру 8. Слой сервисов, последние приготовления
23:39
Паттерн наблюдатель в unity3D
6:56
Максим Крюков
Рет қаралды 25 М.
when you have plan B 😂
00:11
Andrey Grechka
Рет қаралды 67 МЛН