- Unreal Engine Event Tick (UE4, UE5)
- Event Tick Delta Seconds
- Настройки Event Tick в Blueprint Class и Actor Component
- Настройки в Details
- Настройки события Event Tick через код Blueprint при помощи функций
- Практика в Unreal Engine: вращаем объект при помощи Event Tick, включая и выключая Tick при пересечении. Функция «Set Actor Tick Enabled»
- Tick Group в Unreal Engine
- Функция Set Tick Group в Unreal Engine
- Функция Add Tick Prerequisite Actor (Remove Tick Prerequisite Actor)
- Советы при работе с Event Tick в Unreal Engine
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим событие игрового движка Unreal Engine, которое необходимо использовать с большой осторожностью — Event Tick, или, иначе говоря, событие тика (такта) в Анрил Энджин.
Обсудим, для чего предназначено данное событие, почему его нужно использовать с большой осторожностью. Разберём настройки и сопутствующие Event Tick функции. А также на практике разберём несколько примеров кода, связанные с этим событием тика.
В целом же, в данной статье затронем и будем разбирать следующие функции, которые так или иначе связаны с Event Tick в Unreal Engine: «Set Actor Tick Enabled», «Set Actor Tick Interval», «Set Tickable when Paused», «Is Actor Tick Enabled», «Get Actor Tick Interval», «Get Tickable when Paused», «Set Tick Group», «Add Tick Prerequisite Actor», «Remove Tick Prerequisite Actor» и другие вспомогательные функции.
Unreal Engine Event Tick (UE4, UE5)
Event Tick — событие, вызываемое каждый кадр в Actor и других наследуемых от него классах, а также в Actor Component и других наследуемых от него компонентах, если в настройках этих объектов включена подача тактового сигнала (по умолчанию обработка сигналов Event Tick всегда включена). Данное событие предназначено для выполнения определённого логического кода в цикле, который необходимо повторять каждый кадр расчёта и рендеринга игры.
Таким образом, если FPS равен 60 кадрам в секунду, то Event Tick будет вызываться 60 раз за секунду. Если FPS равен 30, то, соответственно, событие будет вызвано 30 раз за секунду.
Из всего выше сказанного следует, что EventTick нужно использовать с особой осторожностью.
На Event Tick не следует выполнять сложные операции, так как это может привести к значительному снижению FPS в игре из-за высокой нагрузки на центральный процессор при расчёте каждого кадра. В худшем же случае игра может и вовсе полностью остановиться.
Event Tick Delta Seconds
В Event Tick имеется важный входящий параметр — Delta Seconds (float). На каждом вызове данного события в этом параметре возвращается период (время в секундах) между текущим и предыдущим вызовом этого события. Для чего это нужно? Всё просто, чтобы уравнять выполнение одной и той же операции на разных компьютерах с разным FPS.
Дело в том, что если код размещается в этом событии, то частота обработки этого кода напрямую зависит от частоты FPS. А она на каждом отдельно взятом ПК разная. И чтобы всё это уравнять, нужно изменить зависимость от частоты кадров на двойную зависимость: одновременно от количества кадров в секунду и временем между этими кадрами.
Например, если на Event Tick обрабатывать перемещение какого-либо объекта на 10 см каждый такт, то получится, что на ПК с 60 FPS за одну секунду объект переместится на 600 см (60 FPS * 10 см). А на компьютере с 30 FPS этот же объект за ту же 1 секунду переместится на 300 см (30 FPS * 10 см). То есть одна и та же операция на разных компьютерах будет выполняться по-разному.
Чтобы этого избежать, в формулу необходимо добавлять период между кадрами. То есть умножать результат на время Delta Seconds. Вернёмся к нашему примеру. У первого ПК с 60 FPS период между кадрами будет равен 0,0166 (1 сек / 60 FPS). У второго — 0.0333 (1 сек / 30 FPS). Это я рассчитал Delta Seconds математически. В реальности же он будет колебаться, так как FPS также изменяется во времени.
Итак, добавим в формулу перемещения объекта параметр Delta Seconds (в нашем примере я его рассчитал математически). Для первого компьютера скорость будет равна 10 см/сек (60 FPS * 10 см * 0,0166). Для второго компьютера — также 10 см/сек (30 FPS * 10 см * 0,0333). В итоге мы получили одинаковую скорость перемещения объекта в 10 см но не в такт, а в секунду и совершенно на разных компьютерах, с разным FPS. Далее этот результат можно помножить на коэффициент скорости, чтобы иметь возможность управлять скоростью перемещения данного объекта.
Ниже приведён пример, как эту задачу мы бы решали на блюпринтах.
Скриншот
Код на BlueprintUE
Таким образом, при помощи параметра Delta Seconds в Event Tick мы уравняли выполнение одной и той же операции в Unreal Engine на совершенно разных компьютерах, сняв зависимость от FPS.
Настройки Event Tick в Blueprint Class и Actor Component
Настройки в Details
Как уже упоминалось ранее, события Event Tick в Unreal Engine (UE4, UE5) следует использовать с осторожностью, поскольку они вызываются каждый такт рендеринга кадра. Однако у нас есть возможность контролировать их частоту вызова или даже полностью отключать, чтобы активировать только на короткое время в определённые моменты.
Данные настройки практически одинаковые, что для Акторов, что для компонентов. Давайте рассмотрим их. Находятся они в настройках Actor и Components во вкладке «Details», обычно в самом верху.
- Start with Tick Enabled (bool, по умолчанию True). Данная настройка позволяет полностью выключить работу Event Tick при старте Актора или Компонента. По умолчанию настройка включена, соответственно, Event Tick изначально во всех Акторах и Компонентах включён.
- Tick Interval (float, по умолчанию 0,0 сек). Этой опцией мы можем контролировать частоту вызова Event Tick (в секундах). Если значение отрицательное или равно 0, то Tick срабатывает каждый кадр. Соответственно, если поставить значение 0.1, то Tick будет вызываться каждые 0.1 секунду, то есть всего 10 раз за секунду.
- Allow Tick Before Begin Play (bool, по умолчанию False). Включить срабатывание Event Tick, до начала события Begin Play.
- Tick Even when Paused (bool, по умолчанию = False). Включить срабатывание Event Tick, когда игра стоит на паузе.
- Allow Tick on Dedicated Server (bool, по умолчанию = True). Разрешить работу Event Tick на выделенном сервере.
- Tick Group. Определяет группу порядка срабатывания Tick при обновлении кадра. Данные группы мы разберём ниже, в следующем разделе.
Настройки события Event Tick через код Blueprint при помощи функций
Естественно, в Анрил Энджин существует возможность настраивать данные опции непосредственно из кода блюпринта при помощи соответствующих функций:
- Set Actor Tick Enabled — включить/выключить вызов тика для текущего объекта.
- Set Actor Tick Interval — установить интервал между вызовом Event Tick.
- Set Tickable when Paused — включить/выключить вызов тика в режиме паузы игры.
- Is Actor Tick Enabled — возвращает информацию о том, включён ли тик у актора.
- Get Actor Tick Interval — возвращает информацию об интервале между вызовами Tick.
- Get Tickable when Paused — возвращает информацию о том, включён ли тик во время паузы игры.
Практика в Unreal Engine: вращаем объект при помощи Event Tick, включая и выключая Tick при пересечении. Функция «Set Actor Tick Enabled»
Так как Event Tick — событие, которое потенциально может сильно нагружать систему, то желательно его использовать кратковременно, включая его в коде Blueprint только тогда, когда это действительно необходимо. Давайте рассмотрим на практике небольшой пример, как это можно реализовать.
Пример заключается в следующем: когда игрок приближается к кубу, куб должен начать вращаться. Как только игрок отходит от куба, куб перестаёт вращаться. Вращение куба мы реализуем через Event Tick, выключив его работу по умолчанию. Включать его будем только по пересечении игроком коллизии куба. А при окончании пересечения Event Tick будем вновь отключать.
- Создадим Актор BP_Cube, в котором разместим для наглядности Mesh куба, а также компонент Box Collision для взаимодействия с этим Актором. Далее весь код будем описывать в Event Graph актора BP_Cube.
- Отключим действие события Event Tick, чтобы при размещении актора на игровой уровень данное событие вообще не работало. Для этого в настройках Details актора BP_Cube опцию Start with Tick Enabled поменяем на False.
- Реализуем в Event Tick вращение куба при помощи функции Set World Rotation, добавляя на каждом тике дополнительные значения градусов вращения по оси Z.
- Также воспользуемся параметром Delta Seconds, в качестве коэффициента при расчете добавочных градусов для удаления зависимости от FPS при повороте куба. Для этого умножим значение Delta Seconds на пользовательскую переменную Speed Rotation, содержащую значение скорости поворота.
- Получившееся значение прибавим к текущему значению поворота по оси Z, которое возвратит функция Get World Rotation.
- Итоговое значение суммы подадим во входящий параметр Rotation Z (Yaw) функции Set World Rotation. Именно по этому значению, эта функция и будет поворачивать куб на каждом тике.
- По событию On Component Begin Overlap (Box) при помощи функции Set Actor Tick Enabled включим работу Event Tick, поставив у функции значение True. Таким образом, при пересечении коллизии игроком, тики включатся и куб начнёт своё вращение.
- По событию On Component End Overlap (Box) аналогично при помощи функции Set Actor Tick Enabled выключим работу Event Tick, поставив у функции значение False. Таким образом, при окончании пересечения коллизии игроком, тики вновь выключатся и куб остановит своё вращение.
Скриншот
Код на BlueprintUE
Tick Group в Unreal Engine
По умолчанию, если в настройках не задано иное, акторы и компоненты обновляются один раз в кадр (имеется ввиду запуск их логики). Обновление осуществляется в соответствии с так называемыми группами обновления (Tick Groups), которые можно настроить в параметрах, описанных ранее, или же задать непосредственно в коде.
Группа обновления для актора или компонента служит ориентиром для определения момента, когда он должен обновиться в текущем кадре по отношению к другим процессам в движке, главным образом к физическому моделированию. Каждая группа обновления завершает обработку всех назначенных ей акторов и компонентов до начала обновления следующей группы.
Всего в Unreal Engine (UE4, UE5) существует четыре типа Tick Groups. Разберём их детальнее.
- Pre Physics — перед симуляцией физики. Эту группу тиков следует применять, когда актор или компонент предназначен для взаимодействия с физическими объектами, включая и другие объекты, привязанные к ним. В таком случае движение актора будет завершено и может быть учтено в физическом моделировании. Важно отметить, что при вызове тиков из этой группы данные физического моделирования будут устаревшими на один кадр. Так как в текущем кадре физика ещё не симулировалась.
- During Physics — во время симуляции физики. Так как эта группа тиков вызывается одновременно с физическим моделированием, её рекомендуется использовать только для логики, которая не зависит от данных физики или может позволить себе отставание на один кадр. Типичными примерами являются обновления экранов инвентаря или мини-карты, где данные физики либо не имеют значения, либо отображаются достаточно грубо, чтобы отставание на один кадр не вызывало проблем.
- Post Physics — после симуляции физики. К моменту запуска этой группы тиков результаты физического моделирования для текущего кадра будут полностью готовы. Эту группу можно использовать для той логики, которая должна основываться на результатах физики, где все физические объекты будут находиться в своих окончательных позициях, которые будут использоваться при рендеринге данного кадра.
- Post Update Work — после всей работы. Эта группа начинает выполняться после того, как завершится работа группы Post Physics, а также после обновления всех камер. Исторически сложилось, что основная задача этой группы заключалась в передаче информации о последнем возможном моменте в системы частиц. Если у вас есть эффекты, которые зависят от точного определения направления камеры, это удобное место для размещения Акторов, управляющих этими эффектами. Также эту группу тиков можно использовать для любой игровой логики, которая должна выполняться после всего остального в кадре.
Функция Set Tick Group в Unreal Engine
Вы также можете изменить группу тиков для актора или компонента не только в их настройках, но и в коде с помощью blueprint функции Set Tick Group. Для этого в параметрах функции нужно указать целевой актор или компонент, для которого нужно изменить группу тиков, а затем выбрать одну из четырёх доступных групп, используя параметр Tick Group.
Функция Add Tick Prerequisite Actor (Remove Tick Prerequisite Actor)
Кроме групп тиков, у акторов или компонентов можно настроить вызов Event Tick в зависимости от тиков других акторов. Это означает, что актор или компонент не будет вызывать Event Tick до тех пор, пока не завершится функция тика другого указанного актора или компонента.
Данная зависимость устанавливается функцией Add Tick Prerequisite Actor, которая позволяет в Unreal Engine запустить Event Tick у текущего актора/компонента (параметр Target) только после того, как Tick отработает на другом акторе/компоненте (параметр Prerequisite Actor). Функция Remove Tick Prerequisite Actor делает обратное, она отключает ранее созданную зависимость последовательностей вызова события Tick.
Add Tick Prerequisite Actor может быть особенно полезна для событий Event Tick, которые происходят у разных объектов, объединённых в одну группу Tick Group. В такой ситуации события Tick будут вызываться примерно в одно и то же время в каждом кадре. Однако может возникнуть ситуация, когда один актор или компонент должен подготовить данные, необходимые другому объекту из этой группы. Функция Add Tick Prerequisite Actor позволяет настроить очередь вызова Event Tick для таких объектов.
Советы при работе с Event Tick в Unreal Engine
- Самое первое и основное, о чём мы уже говорили, не обрабатывайте на Event Tick большую, тяжёлую логику. Это может быть смертельно для вашей игры.
- Обязательно снимайте зависимость от FPS в логике, обрабатываемой на тиках, добавляя в формулу кода параметр Delta Seconds.
- Желательно настраивайте логику так, чтобы изначально событие Event Tick было выключено вообще. Включайте его из кода на кратковременные промежутки только тогда, когда это действительно нужно.
- Если Ваша логика позволяет, ограничивайте частоту вызова тика параметром Tick Interval.
- По возможности заменяйте запуск вашей логики с Event Tick на другие события, например, запуск через таймеры.
- Никогда не отслеживайте на тиках какое-либо состояние в вашей игре на постоянной основе, если это можно сделать гораздо реже, в момент изменения этого состояния. Например, не нужно обновлять виджет здоровья на тиках. Его необходимо обновлять лишь в тех случаях, когда оно действительно меняется. То есть, только в момент нанесения урона или лечения.
На этом наша статья заканчивается. В статье мы рассмотрели Event Tick в Unreal Engine (UE4, UE5). Обсудили для чего предназначено данное событие, почему его нужно использовать с большой осторожностью. Разобрали настройки и сопутствующие Event Tick функции. А также на практике разобрали несколько примеров кода, связанные с этим событием тика.
Далее Вы можете перейти к следующей обобщающей статье, чтобы изучить другие многочисленные события игрового движка:
Unreal Engine Events.