Демо-проект:
Аналогия
• Аналогия 1: у нас есть микроволновка с wi-fi. Несколько человек подключились к микроволновке, и подписались на оповещение OnCookingComplete.
Когда микроволновка закончила разогревать еду, она всех оповещает.
• Аналогия 2: На какой-то базе есть охранники с радио-рациями (которые могут только принимать сообщение). И на этой базе есть диспетчерский пульт. С пульта через рацию говорят “идите в подвал“ OnCheckOutTheBasement. И все охранники, у которых есть радио-рации услышали это сообщение и идут в подвал. Пара охранников без раций не услышали сообщения.
• Аналогия 3: Банк оповещает клиентов о начислении зарплаты. Клиентам приходит смс-уведомление.
-----
Реализация
Актор-извещатель всегда один, акторов-получателей может быть много.
Актор-извещатель решает когда послать сообщение в мир (создаёт оповещение). И оповещение получат только те акторы, которые подписаны (bind) на эвент-извещателя.
Актор-извещатель может передать какие-то данные через параметры. Порядок и типы входных параметров называются “сигнатурой эвента“.
Если актору-получателю точно не нужно получать оповещение, нужно отписаться (unbind) от уведомлений.
Прежде чем вы добавляете свои новые диспатчер-эвенты, убедитесь что эти эвенты не созданы уже в Анриале.
-----
Примеры
Желательно называть сообщения диспатчера с префиксом OnSomethingHappend. И так же называть эвенты, на которые мы делаем бинд.
• OnGetItem - какой-то NPC может похвалить главного героя, что тот взял предмет
• OnBeginBuff/OnEndBuff - враги могут отбегать подальше, если узнают, что у персонажа включился бафф на близкий урон.
• OutOfAmmo - если в сумке персонажа кончились патроны, то персонаж может об этом сказать вслух
• OnFinishLevel - враги перестают атаковать, если мы добежали до какого-то места
• OnStrongWind - главного героя начинает сдувать, если WeatherSystem сообщила о сильном ветре. Пули и гранаты летят туда, куда сильно дует ветер.
• OnEveningIsComing/OnNigthIsComing - персонаж включает фонарик, если на улице становится темно
• OnBeatTheBoss (OnDestroyed) - Мы победили босса, и изменилась погода. WeatherSystem ждала от BossEnemy оповещение о смерти, и как оповещениее пришло, погода изменилась.
• OnOkButtonClick - Контроллер или Персонаж ждут нажатия кнопки в UI. UI отправляет диспатчер-сообщение (оповещение) OnOkButtonClick или OnCancelButtonClick, контроллер его получает.
(Примечание: в Блюпринтах можно при создании виджета в контроллере напрямую получить доступ к кнопке и сразу сделать бинд. Это нарушает правила ООП, но такое может быть удобно, если не хочется делать цепочку из диспатчеров.)
• OnLowHealth - Мы стреляем в противников, и как только у нас здоровье опустилось ниже 20%, противники об этом узнают и начинают хуже попадать, у них увеличивается разброс при стрельбе.
• OnDamageIsApplied (OnAnyDamage) - Мы стреляем в противника, трейсом получили на него ссылку, и можем убедиться что в него точно попала пуля. То есть, если мы выстрелили в противника самонаводящейся ракетой, убежали за стену и не видим что там происходит. Ракета долетела и нанесла урон, мы можем получить оповещение о том, что “да, ракета попала в цель“ и может быть разблокировали какую-то ачивку.
Тайм-коды:
00:00 Вступление
00:44 Аналогия
02:04 Реализация
04:41 Примеры
08:05 Заключение
175 views
17
2
5 days ago 00:00:39 1
The Blood of Dawnwalker — Gameplay Reveal Event Announcement