Event Tick — событие тиков в Unreal Engine

Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим событие игрового движка Unreal Engine, которое необходимо использовать с большой осторожностью — Event Tick, или, иначе говоря, событие тика (такта) в Анрил Энджин.

Обсудим, для чего предназначено данное событие, почему его нужно использовать с большой осторожностью. Рассмотрим настройки и сопутствующие Event Tick функции. А также на практике разберём несколько примеров кода, связанные с этим событием.

Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.

Unreal Engine Tick

Для начала я предлагаю определиться, что же такое вообще Tick в Unreal Engine?

Tick (тик, такт) в Unreal Engine — это однократное выполнение логики в игровом цикле. По сути, это сердцебиение игры, определяющее, как часто обновляются объекты в мире. То есть, во время тика движок принимает входящие данные от игрока, обновляет логику для всех объектов игры, рассчитывает физику, освещение и прочие данные игры, а затем визуально прорисовывает кадр (Frame). После всего этого процесса всё повторяется заново.

Таким образом, тики постоянно повторяются друг за другом, образуя бесконечный игровой цикл. С точки зрения визуального обновления кадра, такой процесс еще называют Frame Per Second (кадры в секунду) или FPS.

FPS (кадровая частота) — количество сменяемых кадров за 1 секунду в компьютерных играх, телевидении или кинематографе.

Для того чтобы разработчики могли обновлять логику с повтором в каждый кадр игрового цикла, в Unreal Engine существует специальное событие — Event Tick.

Событие Event Tick

Событие Event Tick в Unreal EngineEvent Tick — событие, вызываемое каждый кадр в Actor и других наследуемых от него классах, а также в Actor Component и других наследуемых от него Components, если в настройках этих объектов включена подача тактового сигнала (по умолчанию обработка сигналов Event Tick всегда включена).

Таким образом, если FPS равен 60 кадрам в секунду, то EventTick будет вызываться 60 раз за секунду. Если FPS равен 30, то, соответственно, событие будет вызвано 30 раз за секунду.

Из всего выше сказанного следует, что данное событие необходимо использовать с особой осторожностью.

На Event Tick не следует выполнять сложные операции, так как это может привести к значительному снижению FPS в игре из-за высокой нагрузки на процессор при расчёте каждого кадра. В худшем же случае игра может и вовсе полностью остановиться.

В целом, событие Event Tick предназначено для выполнения определённого логического кода в цикле, который необходимо повторять каждый кадр расчёта и рендеринга игры. Например, при расчёте движения объектов, обновления состояния анимации, обновления визуальных эффектов и в прочих ситуациях.

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. Далее этот результат можно помножить на коэффициент скорости, чтобы иметь возможность управлять скоростью перемещения данного объекта.

Ниже приведён пример, как эту задачу мы бы решали на блюпринтах.

Скриншот

Практика в Unreal Engine (UE4, UE5): Event Tick Delta Seconds - снимаем зависимость от FPS
Практика в Unreal Engine (UE4, UE5): Event Tick Delta Seconds — снимаем зависимость от FPS

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Таким образом, при помощи параметра Delta Seconds в Event Tick мы уравняли выполнение одной и той же операции в Unreal Engine на совершенно разных компьютерах, сняв зависимость от FPS.

Настройки Event Tick в Blueprint Class и Actor Component

Настройки в Details

Как уже упоминалось ранее, события Event Tick в Unreal Engine (UE4, UE5) следует использовать с осторожностью, поскольку они вызываются каждый такт рендеринга кадра. Однако у нас есть возможность контролировать их частоту вызова или даже полностью отключать, чтобы активировать только на короткое время в определённые моменты.

Данные настройки практически одинаковые, что для Акторов, что для компонентов. Давайте рассмотрим их. Находятся они в настройках Actor и Components во вкладке Details, обычно в самом верху.

Настройки Event Tick в Unreal Engine (UE4, UE5)
Настройки Event Tick в Unreal Engine (UE4, UE5)
  • 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. Определяет группу порядка срабатывания Event 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 — возвращает информацию о том, включён ли тик во время паузы игры.
  • Set Tick Group — устанавливает новую группу Tick Croup для текущего Актора.
Функции 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 Actor Tick Enabled, Set Actor Tick Interval, Set Tickable when Paused, Is Actor Tick Enabled, Get Actor Tick Interval, Get Tickable when Paused

Практика в Unreal Engine: вращаем объект при помощи Event Tick, включая и выключая Tick при пересечении. Функция «Set Actor Tick Enabled»

Так как Event Tick — событие, которое потенциально может сильно нагружать систему, то желательно использовать его кратковременно, включая его в коде Blueprint только тогда, когда это действительно необходимо. Давайте рассмотрим на практике небольшой пример, как это можно реализовать.

Пример заключается в следующем: когда игрок приближается к кубу, куб должен начать вращаться. Как только игрок отходит от куба, куб перестаёт вращаться. Вращение куба мы реализуем через Event Tick, выключив его работу по умолчанию. Включать его будем только по пересечении игроком коллизии куба. А при окончании пересечения Event Tick будем вновь отключать.

  1. Создадим Актор BP_Cube, в котором для наглядности разместим Mesh куба, а также компонент Box Collision для взаимодействия с этим Актором. Далее весь код будем описывать в Event Graph актора BP_Cube.
Разместим в Акторе BP_Cube Mesh куба, а также компонент Box Collision
Разместим в Акторе BP_Cube Mesh куба, а также компонент Box Collision
  1. Отключим действие события Event Tick, чтобы при размещении Актора на игровой уровень данное событие вообще не работало. Для этого в настройках Details Актора BP_Cube опцию Start with Tick Enabled поменяем на False.
Значение Start with Tick Enabled меняем на False
Значение Start with Tick Enabled меняем на False
  1. Реализуем вращение куба при помощи функции Set World Rotation, вызывая её событием Event Tick и добавляя на каждом тике дополнительные значения градусов вращения по оси Z.
  2. Также в качестве коэффициента для удаления зависимости от FPS при расчете добавочных градусов поворота куба воспользуемся параметром Delta Seconds. Для этого умножим значение Delta Seconds на пользовательскую переменную Speed Rotation, содержащую значение скорости поворота.
  3. Получившееся значение прибавим к текущему значению поворота по оси Z, которое возвратит функция Get World Rotation.
  4. Итоговое значение суммы подадим во входящий параметр Rotation Z (Yaw) функции Set World Rotation. Именно по этому значению, эта функция и будет поворачивать куб на каждом тике.
  5. По событию On Component Begin Overlap (Box) при помощи функции Set Actor Tick Enabled включим работу Event Tick, поставив у функции значение True. Таким образом, при пересечении коллизии игроком, тики включатся и куб начнёт своё вращение.
  6. По событию On Component End Overlap (Box) аналогично при помощи функции Set Actor Tick Enabled выключим работу Event Tick, поставив у функции значение False. Таким образом, при окончании пересечения коллизии игроком, тики вновь выключатся и куб остановит своё вращение.

Скриншот

Практика в Unreal Engine: вращаем объект при помощи Event Tick, включая и выключая Tick при пересечении. Функция «Set Actor Tick Enabled»
Практика в Unreal Engine: вращаем объект при помощи Event Tick, включая и выключая Tick при пересечении. Функция «Set Actor Tick Enabled»

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Tick Group в Unreal Engine

Tick Group в Unreal Engine это система, позволяющая контролировать порядок, в котором выполняются события Event Tick у различных Акторов или компонентов относительно друг друга в каждом кадре игрового цикла. Данные группы предоставляют способ управления зависимостями и приоритетами между обновлениями различных объектов игрового мира.

По умолчанию, если в настройках не задано иное, Акторы и компоненты обновляются один раз в кадр (имеется ввиду запуск их логики). При чём обновление осуществляется в соответствии с группами обновления (Tick Groups), которые можно настроить в параметрах, описанных ранее, или же задать непосредственно в коде.

Группа обновления для Актора или компонента служит ориентиром для определения момента, когда он должен обновиться в текущем кадре по отношению к другим процессам в движке, главным образом к физическому моделированию. Каждая группа обновления завершает обработку всех назначенных ей Акторов и компонентов до начала обновления следующей группы.

Всего в Unreal Engine (UE4, UE5) существует 4 типа Tick Groups. Разберём их детальнее.

  1. Pre Physics — перед симуляцией физики. Эту группу тиков следует применять, когда Актор или компонент предназначен для взаимодействия с физическими объектами, включая и другие объекты, привязанные к ним. В таком случае движение Актора будет завершено и может быть учтено в физическом моделировании. Важно отметить, что при вызове тиков из этой группы данные физического моделирования будут устаревшими на один кадр. Так как в текущем кадре физика ещё не симулировалась.
  2. During Physics — во время симуляции физики. Так как эта группа тиков вызывается одновременно с физическим моделированием, её рекомендуется использовать только для логики, которая не зависит от данных физики или может позволить себе отставание на один кадр. Типичными примерами являются обновления экранов инвентаря или мини-карты, где данные физики либо не имеют значения, либо отображаются достаточно грубо, чтобы отставание на один кадр не вызывало проблем.
  3. Post Physics — после симуляции физики. К моменту запуска этой группы тиков результаты физического моделирования для текущего кадра будут полностью готовы. Эту группу можно использовать для той логики, которая должна основываться на результатах физики, где все физические объекты будут находиться в своих окончательных позициях, которые будут использоваться при рендеринге данного кадра.
  4. Post Update Work — после всей работы. Эта группа начинает выполняться после того, как завершится работа группы Post Physics, а также после обновления всех камер. Исторически сложилось, что основная задача этой группы заключалась в передаче информации о последнем возможном моменте в системы частиц. Если у вас есть эффекты, которые зависят от точного определения направления камеры, это удобное место для размещения Акторов, управляющих этими эффектами. Также эту группу тиков можно использовать для любой игровой логики, которая должна выполняться после всего остального в кадре.

Функция Set Tick Group в Unreal Engine

Изменить Tick Group для Актора или компонента можно не только в их настройках, но и в коде с помощью Blueprint-функции Set Tick Group. Для этого в параметрах функции необходимо указать целевой Актор, для которого нужно изменить группу тиков, а затем выбрать одну из четырёх доступных групп, используя параметр New Tick Group.

Функция Set Tick Group
Функция Set 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 и Remove Tick Prerequisite Actor в Unreal Engine (UE4, UE5)
Функции Add Tick Prerequisite Actor и Remove Tick Prerequisite Actor в Unreal Engine (UE4, UE5)

Данные функции имеются как для объектов класса Actor, так и для компонентов класса Actor Component:

  • Add Tick Prerequisite Actor (Actor) — устанавливает зависимость запуска события Event Tick у текущего Актора только после того, как Tick отработает на другом Акторе.
  • Remove Tick Prerequisite Actor (Actor) — отключает ранее созданную зависимость последовательностей вызова события Tick текущего Актора от другого Актора.
  • Add Tick Prerequisite Component (Actor)— устанавливает зависимость запуска события Event Tick у текущего Актора только после того, как Tick отработает на другом компоненте.
  • Remove Tick Prerequisite Component (Actor) — отключает ранее созданную зависимость последовательностей вызова события Tick текущего Актора от другого компонента.
  • Add Tick Prerequisite Actor (Actor Component) — устанавливает зависимость запуска события Event Tick у текущего компонента только после того, как Tick отработает на другом Акторе.
  • Remove Tick Prerequisite Actor (Actor Component) — отключает ранее созданную зависимость последовательностей вызова события Tick текущего компонента от другого Актора.
  • Add Tick Prerequisite Component (Actor Component)— устанавливает зависимость запуска события Event Tick у текущего компонента только после того, как Tick отработает на другом компоненте.
  • Remove Tick Prerequisite Component (Actor Component) — отключает ранее созданную зависимость последовательностей вызова события Tick текущего компонента от другого компонента.

Add Tick Prerequisite Actor может быть особенно полезна для событий Event Tick, которые происходят у разных объектов, объединённых в одну группу Tick Group. В такой ситуации события Tick будут вызываться примерно в одно и то же время в каждом кадре. Однако может возникнуть ситуация, когда один Актор или компонент должен подготовить данные, необходимые другому объекту из этой группы. Функция Add Tick Prerequisite Actor позволяет настроить очередь вызова Event Tick для таких объектов.

Советы при работе с Event Tick в Unreal Engine

  1. Самое первое и основное, о чём мы уже говорили, не обрабатывайте на Event Tick большую, тяжёлую логику. Это может быть смертельно для Вашей игры.
  2. Обязательно снимайте зависимость от FPS в логике, обрабатываемой на тиках, добавляя в формулу кода параметр Delta Seconds.
  3. Желательно настраивайте логику так, чтобы изначально событие Event Tick было выключено вообще. Включайте его из кода на кратковременные промежутки только тогда, когда это действительно нужно.
  4. Если Ваша логика позволяет, ограничивайте частоту вызова тика параметром Tick Interval.
  5. По возможности заменяйте запуск Вашей логики с Event Tick через другие инструменты, например, запуск через таймеры (главное, чтобы только таймер не срабатывал также часто, как и тики).
  6. Никогда не отслеживайте на тиках какое-либо состояние в Вашей игре на постоянной основе, если это можно сделать гораздо реже, в момент изменения этого состояния. Например, не нужно обновлять виджет здоровья на тиках. Его необходимо обновлять лишь в тех случаях, когда оно действительно меняется. То есть, только в момент нанесения урона или лечения.

На этом наша статья заканчивается. В статье мы рассмотрели Event Tick в Unreal Engine (UE4, UE5). Обсудили для чего предназначено данное событие, почему его нужно использовать с большой осторожностью. Разобрали настройки и сопутствующие Event Tick функции. А также на практике разобрали несколько примеров кода, связанные с этим событием.

Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.


наш Телеграм канал

Оцените статью
( 3 оценки, среднее 5 из 5 )
Поделитесь этой статьей со своими знакомыми в социальных сетях, возможно, эта статья кому-то будет полезна
Unreal Engine - это просто
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.