Большинство людей (включая меня), которые начинают работать с 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.