Пользовательские события | ​Event ​Definition

Возможно вы видели такой элемент в триггерах как "Event Definition". И вполне вероятно недоумевали "А как его можно использовать?", "Как его программировать?".
Пытались создать какие-то действия в нём, но всё в пустую.
Эта небольшая статья поможет ВАМ научится определять свои пользовательские события
Местами может быть не понятно, я буду рассказывать конкретно по пользовательским событиям. Другой базовой информации о триггерах не будет

Создание пользовательского события

в правой части триггеров, кликнув правой кнопкой мыши по списку нажмите на пункт "New -> New Event Definition"
Внутри этого созданного события вы увидите базовую структуру Определений действий.
Я расскажу только о тех, что нужны для событий
  • Options: Позволяет задать некоторые опции для определения (Например чаще всего используется Create Thread, делающее так чтобы вызов этого Действия/Условия не останавливал основной код триггера)
  • Parameters: Нужен для того чтобы событие работало только при каких-то прописанных значений (Из стандартных, хороший примером будет событие Key Pressed, в котором в качестве параметра можно выбрать кнопку активации)
На данном этапе уже можно добавить наше созданное событие к любому триггеру. Только она пока ни на что не реагирует

Регистрация события - Немного теории

И тут подошло время к тому, чтобы разобраться как же всё таки настроить событие так, чтобы оно реагировало на нужные нам вещи.
А всё обстоит на самом деле одновременно и очень хитро, а также и очень просто
События реагируют от других действий. Да-да, Те самые события, которые запускают целые цепочки действий, сами запускаются от другой цепочки действий.
Приведу пример:
  • Есть действие, создания юнита Create Units Facing Angle (Кстати именно оно описано в самых недрах движка игры, остальные 3 работают на базе этого действия), оно из названия понятно создаёт юнитов
  • Есть событие Unit is Create, Которое срабатывает после того как каким-либо образом какой-то юнит был создан
  • В код действия создания юнита добавлено специальное действие, которое регистрирует событие создания юнитов
  • И каждый раз, когда используется действие создания юнита где-либо в коде, будет срабатывать определенное действие, которое регистрирует событие, которое уже в свою очередь запустить другие цепочки действий
Мда уж... наверное закипает голова от всех этих действий, событий, условий и прочего

Регистрация события - Практика

Так как же всё таки происходит регистрация события?
Для этого существует специальное действие Register Events, которое необходимо вызывать внутри определяемого события
Оно способно работать в двух режимах:
  1. Добавив это действие в триггер - можно будет динамически назначить на этот триггер указанные события, с указанными параметрами
  1. Если добавить это событие в Event Definition - То оно по сути свяжет это определение события со всеми событиями что будут перечислены в этом действии

Существуют специальные действия с событием, которые позволяют отправлять общие "сообщения" с заданной строкой
  1. Send Generic Event - Действие, отправляющее строку
  1. Generic Event - Событие, регистрирующее строку

И пользовательские события как раз с помощью этого и работают
Нужно, в определении события добавить этот Register Events, и в нём указать событие Generic Event с какой-то строкой
С помощью этого мы связали наше событие с "общим событием", которое будет реагировать только тогда, когда с помощью Send Generic Event будет отправлена указанная строка, в данном случае MyCustomEventDefinition
Теперь из любого другого триггера, мы можем добавить действие Send Generic Event с нашей строкой, но для начала я вам рекомендую для таких вот строк в события, заводить константы типа "Строка", в таком случае вам будет удобнее потом триггерить ваше событие из нескольких мест

Регистрация события - Использование параметров событий

Создание параметров может также показаться непонятным в использовании, но на деле все максимально понятно и логично, вам просто нужно в саму строку события при регистрации, "приплюсовать" строковые значения своих параметров
Вот наглядный пример:
После всех этих манипуляций мы наконец-таки сможем сделать "триггер-обработчик" в котором будет отправлять нашу ивентовую строку, А также для примера создадим два триггера с нашим событием но с разными параметрами

Использование контекста данных.

Ещё одним крайне важным аспектом событий, является то, что для этих самых событий могут записываться некоторые дополнительные данные об этом событии.
Например, многие знают что от события Unit Dies, срабатываемого от смерти любой боевой единицы, можно получить некоторые данные, таких как:
  • Кто умер?
  • Кто убил?
  • Кто владел убитым юнитом?
  • Кто владер убившим юнитом?
  • Откуда был убит юнит?
  • Как был убит юнит?
Эту всю информацию обычно можно получать с помощью специальных функций, навроде Triggering Unit, Killing Unit, Damage Source Position и прочих. Но... можно ли сделать нечто подобное для своих, кастомных функций?
Да, возможно...
В этом нам помогут Локальные таблицы данных.
Информация, которую можно получить из события, записывается в так называемый контекст события триггера. Этот контекст по сути является обычной локальной таблицей данных, которая имеет ключи с определенным шаблоном именования ключей.

Запись данных в контекст

Для записи данных в контекст события, нужно до использования действия Send Generic Event, записать то что хотим передать в событие, используя обычное действие Save Data Table Value ({Data Type}) для записи значения в таблицу данных.
Туда в качестве имени, указать функцию Generic Event Parameter, где в параметр Event Name, нужно указать то же имя события, которые мы отправим в Send Generic Event, а в качестве параметра Parameter прописать любое название параметра, по которому хотим сохранить значение.

Получение данных из контекста

А для получения данных из контекста, необходимо создать одну функцию. В которой необходимо будет вернуть значение из локальной таблицы данных по тому же ключу.
Для этого нужно в созданной функции добавить действие return, в котором указать значение как функцию Value From Data Table ({Data Type}), в имя которой указать всё ту же функцию Generic Event Parameter, в которой в качестве имени события можно указать функцию Triggering Event Name, которая вернёт название сработанного события, а в качестве параметра указать то имя параметра, которое было прописано при записи данных в контекст

Конец

Надеюсь этой статьей я хоть кому-нибудь да помогу. Я и сам недавно пользовательские события освоил, хотя и имею уже достаточно значительный опыт в редакторе
Остались вопросы? Задайте их сообществу! Задать вопрос
`
ОЖИДАНИЕ РЕКЛАМЫ...
38
Кастомные эвенты - важная механика в играх. Но с ними нужно быть осторожным, чтобы не запутать логику. Отлаживать события - иногда сложная задача.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.