Кадр не является постоянной единицей времени
В Unity метод Update вызывается один раз за кадр, а частота кадров может меняться. Представим простую модель движения без физического взаимодействия. Если каждый вызов добавляет 0,1 условной единицы расстояния, при тридцати кадрах за секунду объект пройдёт три единицы. При шестидесяти кадрах за ту же секунду он пройдёт уже шесть. Программа выполняет написанное правило правильно, но само правило описывает расстояние за кадр, хотя автор ожидал скорость за секунду. Поэтому важно подписывать смысл переменной. Число три может обозначать совершенно разные вещи, если единицы измерения остались только в голове разработчика.
Свяжите перемещение с прошедшим временем
Для равномерного движения расстояние определяется умножением скорости на время. В обычном покадровом обновлении Time.deltaTime позволяет учитывать длительность прошедшего кадра в игровом времени. Если скорость равна трём единицам за секунду, при тридцати равномерных кадрах шаг будет около 0,1, а при шестидесяти около 0,05. За одинаковое суммарное игровое время модель проходит одинаковое расстояние. Важно умножать на длительность шага именно скорость изменения, а не любую переменную по привычке. Например, число очков за один подобранный предмет задаётся событием и обычно не должно зависеть от продолжительности кадра.
Проверяйте границы упрощённой модели
Множитель времени помогает сохранить среднюю скорость простого перемещения, но не исправляет автоматически все проблемы игры. При редких обновлениях движение всё равно может выглядеть дёрганым. Физические объекты, столкновения и выбранный способ управления требуют отдельного рассмотрения; их не стоит бездумно переносить в ту же схему. Кроме того, игровое время может отличаться от реального при замедлении или паузе. Для первого упражнения удобно принять обычный масштаб времени и отсутствие столкновений. Тогда можно проверить саму арифметику и понять назначение переменной, не смешивая её с вводом игрока, камерой и другими частями проекта.
Попробуйте на практике
Сравните две бумажные модели движения объекта со скоростью три условные единицы за секунду. Устанавливать Unity для упражнения не требуется.
- В первом варианте задайте постоянный шаг 0,1 за кадр. Посчитайте расстояние за одну секунду при тридцати и шестидесяти кадрах.
- Во втором варианте используйте скорость три за секунду и длительности кадров одна тридцатая и одна шестидесятая секунды. Найдите соответствующие расстояния за кадр.
- Сложите шаги второго варианта за полную секунду. Затем проверьте неравномерные интервалы: 0,2, 0,3 и 0,5 секунды, сохраняя ту же скорость.
- Подпишите возле каждой величины её смысл: скорость, время или расстояние. Отдельно запишите, почему начисление одного очка за предмет не требует такой же формулы.
Как проверить результат. Постоянный шаг даёт три и шесть единиц за секунду, а шаг с учётом времени в обоих случаях даёт три. Для неравномерных интервалов получаются 0,6, 0,9 и 1,5, вместе тоже три.
Частые вопросы
Time.deltaTime делает низкую частоту кадров незаметной?
Нет. Учёт времени поддерживает правильную величину перемещения в этой модели, но не добавляет отсутствующие изображения и не гарантирует визуальную плавность.
Нужно ли умножать на время все значения в скрипте C#?
Нет. Сначала определяют смысл величины. Скорость изменения за секунду и разовое действие по событию требуют разных правил. Механическое добавление множителя времени может создать новую ошибку.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.