Рассказываю про Event Dispatcher. О том, для чего применять, как применять и что стоит учитывать. Полезные ссылки: Наша группа в ВК - uengine Наш Discord - / discord Наш форум - uengine.ru/forum/ Пожертвования - uengine.ru/donation
А как сделать привязку к частям тела к примеру выстрел в тело или в голову и соответственно распределение урона (в голову к примеру 100%, а в тело 30%)
что то у меня не так диспачер работает в версии 21- отвязка не сработала. А не сработала. выявилось только по вычитанию здоровья. Она главное продолжала печатать. Но не выводила числа. Убрал удаление диспачера. Числа появились.
Очень классные уроки, но вот не совсем понял область применения Dispatcher-ов, так то все то же самое и через касты можно получить, да и зачем куда-то передавать инвентарь или хп, если вся логика с этими характеристиками все равно (как правило) выполняется в BP персонажа. Поясните кому не сложно.
через касты тебе придётся заранее прописать всех получателей сообщения(как в электронной почте) и заранее знать что каждый из них должен выполнить. это плохо работает когда у тебя акторы динамически создаются во время игры и ты не знаешь получателей заранее и тебе нужно мастерить какой-то код для их вычисления (например записывать их в список, потом при наступлении события проходить по списку и делать касты к каждому а чтобы знать что какой актор должен сделать ему при записи в список надо также добавлять во второй столбец какие-то ссылки на инструкции которые его попросят выполнить при наступлении события.. вот подобный механизм удобно реализован эвент диспатчером). в случае с диспатчером ты просто кричишь в окно лето пришло, и все кто играет в песочнице делают то что у них запланировано на лето.
@@danielluko7635 это называется нужно заранее знать всех получателей которым надо доставить сообщение и каждому его лично передать.. ну допустим у вас динамически генерируются мячики и по событию они все должны раздвоиться, функцию раздвоения пишем в мячике, а по событию тупо берём всех экземпляров актора и вызываем ему функцию обработчик эвента. вроде норм никаких диспатчеров не надо. но вот теперь у нас раздваиваться должны только некоторые мячики ну ладно перепишем обработчик мячика добавим булевую переменную в обработчик эвента. ой а чего так лагает каждый раз когда из 100 мячиков раздвоиться должны только 5, а у нас всегда 100 вызовов гоняется толку что большинство пустые.. а может можно просто в методе хранить список только тех обработчиков эвента у тех экземпляров класса которые должны реагировать на него? и вызывать только их.. да не вопрос (думаю реализация очевидна список и пару методов для его обновления добавить в объект генерирующий эвент несложно).. а потом ой а зачем реализацию этих методов и список каждый раз писать, может их выпихнуть в отдельный класс который будет хранить все эвенты и списки тех кто на них подписался( ну вроде тоже несложно сделать) и вот так мы сделали свой эвент диспатчер.
@@TheroLayfer Просто я изучал Unity с C# , и там такого понятия не было, обычно общение между классами происходит с помощью переменных этого класса и вызова их функций насколько я знаю. А тут автор видео говорит что "нужно писать только тот код, который относится к этому объекту" и тут не очень понятно что плохого в вызове функции из другого класса и не очень понимаю ту границу между диспатчером и вызовом функции из другого класса, т.е. что когда использовать.
@@danielluko7635 если игра в перспективе може стать сложной лучше сразу через диспатчер делать, ну не навызываешься ты на тысячи объектов где у кого какая логика, поэтому логику дробят чтобы цвет травы в траве задавался, а восход солнца в небе чтобы потом можно было независимо убедиться вот код цветка он слушает эвент восхода солнца и отрабатывает раскрытие бутона? хорошо, а вот код солнышка оно создаёт при восходе в диспатчере эвент? отлично. для простых игр можно конечно просто из солнышка фигачить раскрытие бутона, особенно если ты один над кодом работаешь а не так что у тебя травинку один отдел пишет, лесок другой, а в поле каждый колосок вообще будет через встроенный скриптовый язык как UGC добавлен и мы им в апи просто сунем метод позволяющий подписаться на любой из существующих эвентов а чё они там с него вызовут вообще не знать бы. и ты в солнышке просто создал эвент восхода проверил что всё работает и всё никто из этих травяных или лесных в твой солнечный код не лазит каждый раз когда решит что хочет бутон или шишку распустить, да и даже если этот лесник это ты сам из другого временного промежутка незачем этому криворукому дебилу в хороший код лазить.
Так, а чем тогда интерфейсы отличаются от диспетчера? По сути, вроде как, одно и то же: есть объект, в котором интерфейс\диспетчер прописан без реализации, а есть объект, в котором эта реализация прописана.
Что-то общее действительно есть. Интерфейс идет как часть полиморфизма и служит для создания единых методов чтоб управлять разными классами извне, например, есть какой то сервис и он манипулирует группой разных объектов(у которых общий интерфейс) с помощью интерфейса. В случае с диспатчером же все ровно наоборот: мы создаем в объекте слушателя, который прикрепляется к диспатчеру и когда диспатчер отрабатывает, то слушатель в объекте об этом уведомляется и уже изолированно сам объект как то на это реагирует. Можно одно и то же сделать обоими вариантами, только диспатчеры предоставляют более гибкий и легкий способ отвязать слушателя от диспатчера, когда в случае с интерфейсом нам надо будет постоянно помещать и убирать объект из пула объектов, чтоб предотвратить вызов метода, когда он нам не нужен.
у меня почемуто гейм мод пустой. Не в том смысле что пустое окно редактора, а совсем ничего нет. Ни бара сбоку где создавать поюшки ни основной области куда накидывать блоки. Тупо пустое серое окно с вкладнками файл, окно, вид и т.д. ВТФ?
А что будет, если диспачер находится во многих классах(БП) и вдруг нам понадобилось изменить/добавить/удалить параметр в главном классе, потом руками перебирать овер дофига классов делая перепривязку/рефреш привязанность кастомного эвента? И почему получая, скажем, персонажа неправильно получать из него что то? Например какой либо флаг? Какой то диссонанс))
@@xl1034 Зачем обрабатывать реакцию на вызов диспатчера в том же объекте, в котором он и вызывается? Наоборот же. Например, у нас динамит с таймером. Персонаж по нажатию на "B" делает трейс, получает объект bp_dynamite и вызывает у него функцию StartTimer или StopTimer при повторном нажатии. И тут всё просто и понятно. Динамит сам тикает, взрывается, вызывает систему частиц итд. Но, допустим, мы хотим на момент взрыва забиндить какое-нибудь событие на сцене. Не проверять же в тике каждый кадр взорвался динамит или нет. Вот тут и нужен как раз диспатчер. В ивент-графе уровня берем объект динамита и биндим на его диспатчер boom событие OnDynamiteBoom.