unity зачем умножать на time deltatime
Какую основную функцию выполняет Time.deltaTime в Unity?
Я учусь разработке игр в Unity. Недавно я получил структуру для функции Time.deltaTime во время кода, который я изучал из учебников. Я искал об этом для лучшего понимания, но не понял основной цели его использования, как это объясняется на профессиональном уровне. Короче говоря, я хочу несколько простых объяснений. Итак, я могу понять из этого.
3 ответа
Рендеринг и выполнение скрипта требует времени. Это отличается каждый кадр. Если вы хотите
Чтобы обрабатывать кадры разной длины, вы получаете «Time.deltaTime». В Update он сообщит вам, сколько секунд прошло (обычно это доля, например, 0,00132), чтобы закончить последний кадр.
Если вы теперь переместите объект из A в B, используя этот код:
Это будет двигаться 0,05 единиц на кадр. После 100 кадров он переместился на 5 единиц.
Таким образом, вашему объекту потребуется 1-5 секунд, чтобы пройти это расстояние.
Но если вы сделаете это:
Он будет двигаться 5 единиц в 1 секунду. Независимо от частоты кадров. Потому что, если у вас есть 10000 кадров в секунду, deltaTime будет очень очень маленьким, поэтому он будет перемещаться лишь очень маленьким битом в каждом кадре.
Примечание. В FixedUpdate() он технически не на 100% одинаков для каждого кадра, но вы должны действовать так, как будто он всегда равен 0.02f или каков бы ни был установлен физический интервал. Независимо от частоты кадров Time.deltaTime в FixedUpdate() вернет fixedDeltaTime
Это свойство предоставляет время между текущим и предыдущим кадром.
Вы можете использовать это, например, для проверки частоты кадров. Также, как сказано здесь
Русские Блоги
время
Time.Deltatime Я считаю, что все использовали это, и сегодня я проанализирую что-то, связанное с DeltaTime
1. Понимание по определению
Unity3D официальный сайтПравильный Time.Deltatime Учитывая это описание:
The time in seconds it took to complete the last frame (Read Only).
То есть для предыдущего кадра время от начала до конца равно Time.DeltaTime. Мы также можем понять это так:
После обработки этой строки кода в последнем кадре мы возвращаемся к этой строке кода в этом кадре, и время прошло Time.DeltaTime секунд.
Кроме того, согласно определению, мы не трудно ввести, Time.Deltatime Должно бытьСек / кадр。
2. Понимание в использовании
вUnity3D официальный сайтНа это также есть предложение:
If you add or subtract to a value every frame chances are you should multiply with Time.deltaTime. When you multiply with Time.deltaTime you essentially express: I want to move this object 10 meters per second instead of 10 meters per frame.
Значение примерно, если вы хотите определить объект каждыйвторойДвигайтесь 10 метров вместо каждогоРамкаДвигайся 10 метров. Пожалуйста, умножьте DeltaTime после 10, чтобы он стал10 m/s。
Может быть, в первый раз, когда вы почувствуете, что это предложение немного волшебно, как вы можете умножить DeltaTime, чтобы заставить объект двигаться в зависимости от времени?
Предположим теперь, что есть переменная скорость = 10 м / с, есть надежда, что во время воспроизведения объект будет двигаться в соответствии с этой скоростью. Итак, когда мы сфокусировались на методе Update, мы подумали о том, какое расстояние нам нужно пройти в каждом кадре, чтобы имитировать скорость движения в реальном состоянии? То есть рассчитать X м / кадр.
От предыдущего кадра к этому кадру время прошло в секундах DeltaTime, и истинная скорость движения составляет 10 м / с, поэтому за истекшее время объект должен двигаться на расстояние DeltaTime * 10, и Это расстояние в точности равно расстоянию, перемещенному от предыдущего кадра к этому кадру.
Согласно этой идее, следующая формула может быть перечислена:
10 м / с × DeltaTime s / frame = X м / frame
И эта формула как раз и есть метод использования, предложенный на официальном сайте.
3.1 Внимание понимание
Unity3D официальный сайтЕсть также некоторые меры предосторожности:
When called from inside MonoBehaviour’s FixedUpdate, returns the fixed framerate delta time.
Сначала напишите код скрипта:
Затем вы можете запустить, чтобы увидеть эффект:
Посредством наблюдения было обнаружено, что время, отображаемое с помощью FixedUpdate, является установленным фиксированным значением 0,02 секунды, и обновление не обязательно, но оно намного меньше времени, отображаемого с помощью FixedUpdate. Таким образом, мы можем заключить, что FixedUpdate также может быть использован напрямую Time.DeltaTime 。
Почему Time.DeltaTime Разные методы могут возвращать разные значения, как этого добиться. Пока я не знаю, я надеюсь, что читатели, у которых есть идеи для реализации, могут оставить сообщение и обменяться.
Note that you should not rely on Time.deltaTime from inside OnGUI since OnGUI can be called multiple times per frame and deltaTime would hold the same value each call, until next frame where it would be updated again.
Смысл не в том, чтобы использовать DeltaTime в OnGUI, потому что OnGUI может вызываться несколько раз в одном кадре. Что касается того, почему вы должны обращать на это внимание в принципе, я считаю, что читатели, которые внимательно прочитали вышеуказанное содержание, могут иметь глубокое понимание.
4. Вывод
Зачем усердно работать и думать о начале. —— Чжоу Синчи
Когда вы умножаете на Time.deltaTime в Unity?
Я понимаю, что Time.deltaTime используется для обеспечения независимости определенных действий от частоты кадров, но есть некоторые ситуации, когда неясно, является ли действие независимым от частоты кадров. Например:
Я видел решения для отдельных ситуаций, но было бы неплохо, если бы была простая интуиция, которая могла бы разрешить все эти ситуации.
2 ответа
Интуиция
Умножение на Time.deltaTime используется для того, чтобы мгновенная операция действовала непрерывно (или «плавно»).
Мгновенное срабатывание заставит определенное количество «перейти» к другому значению. Следующие операции являются мгновенными :
Напротив, следующие операции являются непрерывными :
Все вышеперечисленные операции применяются в течение всего кадра (по крайней мере, концептуально это происходит; то, что физическая система делает внутренне, выходит за рамки этого ответа). Чтобы проиллюстрировать это, Rigidbody.AddForce(1, ForceMode.Force) вызовет приложение силы в 1 ньютон к объекту для всего кадра; не будет резких скачков положения или скорости.
Пример 1: Взрыв
Пример 2: Переезд
Пример 3: Ускорение
Этот код применяет ускорение в течение всего кадра. Этот код также (на мой взгляд) чище и проще для понимания.
Вывод
Умножайте на Time.deltaTime только в том случае, если вы хотите, чтобы мгновенная операция выполнялась плавно в серии кадров.
When do you multiply by Time.deltaTime in Unity?
I understand that Time.deltaTime is used to make certain actions framerate independent, but there are some situations where it isn’t clear whether an action is framerate independent. For instance:
I’ve seen solutions to individual situations, but it would be nice if there were a simple intuition which could address all of these situations.
2 Answers 2
The intuition
Multiplying by Time.deltaTime is used to make an instantaneous operation act in a continuous (or «smooth») way.
An instantaneous operation will cause a certain quantity to «jump» to a different value. The following operations are instantaneous:
In contrast, the following operations are continuous:
All the above operations are applied over the course of the frame (at least conceptually this happens; what the physics system does internally is out of the scope of this answer). To illustrate this, Rigidbody.AddForce(1, ForceMode.Force) will cause a force of 1 newton to be applied to an object for the entire frame; there will be no sudden jumps in position or velocity.
Example 1: Explosion
Here you should not be multiplying by Time.deltaTime since Explode() gets called just once. It is not meant to be applied over a series of frames.
Example 2: Moving
Here you do have to multiply by Time.deltaTime because the object is supposed to move continuously over time, and you are also using an instantaneous operation. Note that this could be replaced with a continuous operation, and remove the need for multiplying by Time.deltaTime :
Example 3: Accelerating
Here you should be multiplying by Time.deltaTime because you want the velocity to increase at a consistent rate frame by frame. Note that this is precisely equivalent to:
This code applies the acceleration over the course of the whole frame. This code is also (in my opinion) cleaner and easier to understand.
Being in FixedUpdate does not effect any of the above advice. Yes, you could theoretically get away with never multiplying by Time.deltaTime since the time between frames would always be the same. But then all your units would have to be dependent on the fixed frame rate. So for example if you wanted to move at a rate of 1 m/s with 60 frames per second, you would have to add 1/60=.01666 to the position each frame. And then imagine what happens if you change your fixed timestep. You would have to change a bunch of your constants to accommodate.
Unity зачем умножать на time deltatime
ВСЁ ДЛЯ UNITY3D (U3D) запись закреплена
Перевод официального урока по скриптингу про Time.deltaTime для плавного изменения переменной, например плавного перемещения объекта или камеры
»Умножать все равно нужно, в Update на DeltaTime, в FixedUpdate на fixedDeltaTime, поскольку так мы привязываем скорость к секунде, а не количеству кадров или обновлений физики, что повышает читаемость кода.
По читаемости кода тоже непонятно. Я сам не программист, а дизайнер, но пришлось учить программирование, чтобы была возможность делать игры, поэтому я не совсем понимаю эту логику.
Показать полностью.
Я просто все события игры поместил в FixedUpdate (кроме тех, когда включена пауза, то есть меню интерфейс), и мне кажется читаемость кода легче, если там будет меньше текста и переменных, как тут.
void FixedUpdate() <
variable += 0.1f;
>
Если везде будет еще в коде deltaTime, то кода будет больше, в следствии чего читаемость хуже для меня:
Я все-таки использую дельту, но только для работы с интерфейсом, для работе в паузе. И использую свою дельту, то есть если внезапно игра подвисла, то моя дельта не превышает небольшой отметки, автоматически срезается большое значение, я так понял в стандартной дельте юнити это не предусмотрено, ибо смотрел несколько игр, к примеру на GameJolt игра Mana Spark, у меня когда она подвисала, то внезапно враги перемещались (из-за большой дельты, пока вис компьютер) за экран, за стены, и игра получалась непроходимой.
(надеюсь я правильно написал на C#, потому-что мой код в оригинале на ЯваСкрипте, пока только переучиваюсь на Си шарп, еще очень плохо знаю)