Большинство людей (включая меня), которые начинают работать с Unity, испытывают проблемы с обучением Time.deltaTime. Чтобы понять, как это работает, сначала я объясню его определение. Затем я покажу пошаговый пример.

По определению Time.deltaTime - это время завершения в секундах с момента последнего кадра. Это помогает нам сделать игру независимой от кадров. То есть, независимо от fps, игра будет выполняться с одинаковой скоростью. Давайте разберемся, что это значит:

Допустим, наша игра работает со скоростью 60 кадров в секунду. То есть игра обновляется 60 раз в секунду, то есть 60 кадров.

Примечание. FPS - это количество кадров в секунду.

Теперь посмотрим на время между кадрами:

Сначала начинается игра, выполняется кадр 1, затем заканчивается кадр 1, поэтому выполняется кадр 2. Time.deltaTime начал вычисление, когда закончился кадр 1, и закончил вычисление, когда закончился кадр 2. Давайте посмотрим на изображение ниже, чтобы понять это:

  • Перед выполнением кадра 1 Time.deltaTime равен 0
  • Затем игра продолжается, и выполняется кадр 2. Итак, время между этими двумя кадрами составляет 0,05 секунды.
  • Итак, Time.deltaTime составляет 0,05 секунды. Вот почему мы называем это временем, прошедшим с последнего кадра.

Примечание. Его значение постоянно меняется, в этом примере я просто использовал 0,05.

Когда мы поняли, что это означает, давайте посмотрим, как это используется и почему мы его используем:

Всегда, когда мы хотим переместить объект, мы, несомненно, используем метод Update().

Примечание. Метод Update () вызывается один раз для каждого кадра.

Я хочу показать разницу между использованием Time.deltaTime и его неиспользованием.

У меня простой player:

И я прикрепил к нему Test скрипт

Код скрипта выглядит так:

  • Я объявил переменную float speed и присвоил ей 10
  • Затем в Update() методе я использовал метод Translate преобразования, чтобы переместить объект
  • Он перемещает объект вперед и умножает forward вектор на скорость
    Я не умножал его на Time.deltaTime намеренно

Примечание. Space.Self - это параметр, который используется для перемещения локальной оси объекта, а не для мировой оси (нам не нужно этого знать, я просто объяснил людям, которым это интересно)

Без использования Time.deltaTime

Давайте посчитаем наше общее движение, когда мы не используем Time.deltaTime:

Предположим, мы тестируем нашу игру на двух разных компьютерах. В игре один из них набирает 20 кадров в секунду, а другой - 500 кадров в секунду.

Расчет полного движения для первого компьютера

Во-первых, давайте посмотрим на общее движение компьютера (20 кадров в секунду):

За 1 секунду метод Update() будет выполнен 20 раз.

Наше общее движение будет выглядеть так:

total movement = 20 * Vector3.forward * speed

Обратите внимание, что Vector3.forward - это сокращение от записи new Vector3 (0, 0, 1), поэтому он перемещается на 1 единицу.

Если посчитать общее движение, мы получим:

total movement = 20 * 1 * 10 = 200;

Расчет полного движения для второго компьютера

Теперь давайте посмотрим на общее движение второго компьютера (500 кадров в секунду).

За 1 секунду метод Update() будет выполнен 500 раз.

Наше общее движение будет выглядеть так:

total movement = 500 * Vector3.forward * speed

Теперь, если мы посчитаем общее движение, мы получим:

total movement = 500 * 1 * 10 = 5000;

Игрок, который играет со скоростью 20 кадров в секунду, переместил 200 единиц, а другой игрок, который играет со скоростью 500 кадров в секунду, переместил 5000 единиц. Как видите, он зависит от кадра

Использование Time.deltaTime

Теперь я изменил код, так что вектор движения тоже умножается на Time.deltaTime:

Расчет общего движения для первого компьютера

За 1 секунду метод Update() будет выполнен 20 раз

Time.deltaTime приблизительно равно 1, деленному на количество кадров в секунду. Потому что игра запускается 20 раз в секунду, поэтому 1 / 20 - это время для каждого кадра.

Time.deltaTime = 1 / 20 = 0.05

Наше общее движение будет выглядеть так:

total movement = 20 * Vector3.forward * speed * Time.deltaTime

Теперь, если мы посчитаем движение:

total movement = 20 * 1 * 10 * 0.05 = 10

Расчет полного движения для второго компьютера

Для 500 кадров в секунду за 1 секунду метод Update() будет выполнен 500 раз.

Итак, Time.deltaTime равно следующему:

Time.deltaTime = 1 / 500 = 0.002

Наше общее движение будет выглядеть так:

total movement = 20 * Vector3.forward * speed * Time.deltaTime

Теперь, если мы посчитаем движение:

total movement = 500 * 1 * 10 * 0.002 = 10

Как видите, когда мы используем Time.deltaTime, общее движение равно 10. Итак, мы видим, что это frame-independent.. Независимо от того, насколько быстр компьютер, игра будет проходить с той же скоростью.

Это все для этой статьи. Надеюсь, это было понятно, и вы поняли Time.deltaTime.