В этом уроке мы разберём, что такое Time.deltaTime в Unity и как его использовать.
Видеоверсия этого руководства в настоящее время недоступна на этом языке.
Текстовая расшифровка видео
Всем привет! В этом уроке мы разберём, что такое Time.deltaTime в Unity и как его использовать.
Этот урок для начинающих отлично подойдёт тем, кто только знакомится со скриптингом на C# в Unity, поскольку тема является фундаментальной и её важно хорошо понять. Вы будете встречать её во многих скриптах и обучающих материалах.
Урок создан в Unity 2022, однако Time.deltaTime присутствует во многих версиях программы и, скорее всего, останется в будущих версиях.
Time.deltaTime — это переменная, которая представляет собой время в секундах, прошедшее между предыдущим и текущим кадром, то есть время, затраченное на обработку предыдущего кадра.

Она используется для того, чтобы движение и анимации не зависели от частоты кадров. Обычно скорость объекта в единицах в секунду умножается на Time.deltaTime в каждом кадре.
Таким образом, величина перемещения за один кадр будет меняться в зависимости от частоты кадров, обеспечивая одинаковую скорость на устройствах с разной производительностью.
Давайте рассмотрим практический пример, иллюстрирующий сказанное, на очень простом случае: движение объекта вдоль одной оси с постоянной скоростью. Добавьте объект на сцену и установите вид сверху в режиме Isometric.

Добавьте объекту C# скрипт, назвав его, например, movement, затем создайте Vector3, который будет задавать смещение на одну единицу, которое мы хотим пройти за одну секунду:
private Vector3 obVelocity = new Vector3(0.0f, 0.0f, 1.0f);
Мы знаем, что функция Update вызывается каждый кадр. Однако мы не знаем, сколько кадров в секунду будет выполнять игра, поскольку это зависит от различных параметров.
Если бы частота кадров всегда составляла 50 кадров в секунду, мы могли бы изменить obVelocity на (0.0f, 0.0f, 0.02f), чтобы при каждом вызове Update, а значит и при каждом кадре, объект перемещался на 0.02 единицы, что дало бы смещение на одну единицу в секунду.
Так как мы не можем на это рассчитывать, в функции Update мы напишем:
transform.position += (obVelocity * Time.deltaTime);

Сохраните скрипт и вернитесь в Unity Editor, чтобы увидеть результат: объект движется линейно, сохраняя скорость в одну единицу сцены в секунду.
В итоге, чтобы переместить объект с определённой скоростью, выраженной в единицах сцены в секунду, задайте эту скорость в переменной и внутри функции Update умножайте её на Time.deltaTime, как было показано ранее.
Теперь рассмотрим другой пример.
В используемой сейчас сцене у Main Camera есть скрипт перемещения, который отслеживает нажатия стрелок с помощью Input.GetAxis для Horizontal и Vertical.
Значения Horizontal и Vertical варьируются от -1 до 1. Если бы я напрямую умножил эти значения на Time.deltaTime в функции Update, то получил бы перемещение на одну единицу сцены в секунду, однако такой способ не позволяет настраивать скорость.
Чтобы решить эту проблему, проще всего определить приватную переменную с модификатором Serialized, которая будет отображаться и изменяться в Inspector во время тестирования игры в Editor.
В видео эта переменная называется speed и изначально имеет значение 12.

В функции Update движение осуществляется через controller.Move, поскольку персонаж связан с компонентом Character Controller, который перемещается с помощью функции Move.
Функция вызывается с довольно длинным параметром, который делится на две части.
В первой части рассчитывается перемещение по осям X и Z на основе ввода пользователя, сохранённого в переменной move, которая является Vector3.
Во второй части рассчитывается действие силы тяжести при выполнении прыжка.

Time.deltaTime используется как при расчёте движения по осям, так и при вертикальном движении под действием гравитации, но вторую часть мы сейчас рассматривать не будем, поскольку это потребовало бы более подробного объяснения, и сосредоточимся на первой.
Вектор перемещения move умножается на Time.deltaTime, как и в примере с кубом, но дополнительно умножается на переменную типа float speed.
Затем я перехожу в Unity Editor и запускаю игру, чтобы показать, как можно изменять скорость движения персонажа в реальном времени, меняя значение параметра Speed во вкладке скрипта.
Таким образом можно откалибровать скорость перед началом игры.
Поскольку эта скорость умножается на Time.deltaTime, мы знаем, что она будет одинаковой на разных устройствах, независимо от частоты кадров.
Так как speed является переменной в коде, её также можно изменять во время игры в зависимости от определённых событий.
Например, персонаж может выпить зелье, позволяющее двигаться в два раза быстрее, или наоборот начать двигаться медленнее обычного.
Главная идея в том, что эта скорость будет одинаковой на разных устройствах, так как она не зависит от частоты кадров благодаря Time.deltaTime.
В этом видео мы рассмотрели два простых примера использования Time.deltaTime.
Вскоре я опубликую видео о вращениях с использованием Slerp, где Time.deltaTime будет применяться для достижения постоянной скорости вращения независимо от частоты кадров.
На этом всё. До скорой встречи!