Time and Framerate Management
The Update function allows you to monitor inputs and other events regularly from a script and take appropriate action. For example, you might move a character when the “forward” key is pressed. An important thing to remember when handling time-based actions like this is that the game’s framerate is not constant and neither is the length of time between Update function calls.
As an example of this, consider the task of moving an object forward gradually, one frame at a time. It might seem at first that you could just shift the object by a fixed distance each frame:
However, given that the frame time is not constant, the object will appear to move at an irregular speed. If the frame time is 10 milliseconds then the object will step forward by distancePerFrame one hundred times per second. But if the frame time increases to 25 milliseconds (due to CPU load, say) then it will only step forward forty times a second and therefore cover less distance. The solution is to scale the size of the movement by the frame time which you can read from the Time.deltaTime property:
Note that the movement is now given as distancePerSecond rather than distancePerFrame. As the framerate changes, the size of the movement step will change accordingly and so the object’s speed will be constant.
Fixed Timestep
Unlike the main frame update, Unity’s physics system does work to a fixed timestep, which is important for the accuracy and consistency of the simulation. At the start of the physics update, Unity sets an “alarm” by adding the fixed timestep value onto the time when the last physics update ended. The physics system will then perform calculations until the alarm goes off.
You can change the size of the fixed timestep from the Time Manager and you can read it from a script using the Time.fixedDeltaTime property. Note that a lower value for the timestep will result in more frequent physics updates and more precise simulation but at the cost of greater CPU load. You probably won’t need to change the default fixed timestep unless you are placing high demands on the physics engine.
Maximum Allowed Timestep
The fixed timestep keeps the physical simulation accurate in real time but it can cause problems in cases where the game makes heavy use of physics and the gameplay framerate has also become low (due to a large number of objects in play, say). The main frame update processing has to be “squeezed” in between the regular physics updates and if there is a lot of processing to do then several physics updates can take place during a single frame. Since the frame time, positions of objects and other properties are frozen at the start of the frame, the graphics can get out of sync with the more frequently updated physics.
Naturally, there is only so much CPU power available but Unity has an option to let you effectively slow down physics time to let the frame processing catch up. The Maximum Allowed Timestep setting (in the Time Manager) puts a limit on the amount of time Unity will spend processing physics and FixedUpdate calls during a given frame update. If a frame update takes longer than Maximum Allowed Timestep to process, the physics engine will “stop time” and let the frame processing catch up. Once the frame update has finished, the physics will resume as though no time has passed since it was stopped. The result of this is that rigidbodies will not move perfectly in real time as they usually do but will be slowed slightly. However, the physics “clock” will still track them as though they were moving normally. The slowing of physics time is usually not noticeable and is an acceptable trade-off against gameplay performance.
Time Scale
For special effects, such as “bullet-time”, it is sometimes useful to slow the passage of game time so that animations and script responses happen at a reduced rate. Furthermore, you may sometimes want to freeze game time completely, as when the game is paused. Unity has a Time Scale property that controls how fast game time proceeds relative to real time. If the scale is set to 1.0 then game time matches real time. A value of 2.0 makes time pass twice as quickly in Unity (ie, the action will be speeded-up) while a value of 0.5 will slow gameplay down to half speed. A value of zero will make time “stop” completely. Note that the time scale doesn’t actually slow execution but simply changes the time step reported to the Update and FixedUpdate functions via Time.deltaTime and Time.fixedDeltaTime. The Update function is likely to be called more often than usual when game time is slowed down but the deltaTime step reported each frame will simply be reduced. Other script functions are not affected by the time scale so you can, for example, display a GUI with normal interaction when the game is paused.
The Time Manager has a property to let you set the time scale globally but it is generally more useful to set the value from a script using the Time.timeScale property:
Capture Framerate
A very special case of time management is where you want to record gameplay as a video. Since the task of saving screen images takes considerable time, the usual framerate of the game will be drastically reduced if you attempt to do this during normal gameplay. This will result in a video that doesn’t reflect the true performance of the game.
Источник
Unity fraternity часы настроить
The Time settings (menu: Edit > Project Settings, then the Time_ category) lets you set a number of properties that control timing within your game.
Свойства
| Свойство: | Функция: |
|---|---|
| Fixed Timestep | Не зависящий от частоты кадров интервал, с которым производятся расчёты физики и вызовы событий FixedUpdate(). |
| Maximum Allowed Timestep | Не зависящий от частоты кадров интервал, который будет использован при самом плохом развитии событий, когда частота кадров низка. Расчёты физики и вызовы событий FixedUpdate() не будут производиться дольше, чем указано в этом свойстве. |
| Time Scale | The speed at which time progresses. Change this value to simulate bullet-time effects. A value of 1 means real-time. A value of .5 means half speed; a value of 2 is double speed. |
| Maximum Particle Timestep | A framerate-independent interval that controls the accuracy of the particle simulation. When the frame time exceeds this value, multiple iterations of the particle update are performed in one frame, so that the duration of each step does not exceed this value. For example, a game running at 30fps (0.03 seconds per frame) could run the particle update at 60fps (in steps of 0.0167 seconds) to achieve a more accurate simulation, at the expense of performance. |
Детали
The Time Manager lets you set properties globally, but it is often useful to set them from a script during gameplay (for example, setting Time Scale to zero is a useful way to pause the game). See the page on Time and Framerate Management for full details of how time can be managed in Unity.
2017–05–18 Page published
Maximum Particle Timestep added in 2017.1 NewIn20171
Источник
Создание часов в Unity
Предполагается, что у вы уже знакомы с этим игровым движком. Если нет, изучите вводные уроки по Unity.
Создаем часы в Unity
Мы начнем с создания нового проекта Unity без каких-либо пакетов. По умолчанию сцена содержит камеру, расположенную в точке (0, 1, -10) , смотрящую вниз относительно оси Z. Чтобы сделать такую же перспективу как у камеры на вкладке Scene, выбетите камеру и установите GameObject / Align View to Selected из меню.
Нам нужна структура объекта, который будет представлять собой часы. Создайте новый пустой GameObject с помощью GameObject / Create Empty, установите его position (положение) в (0,0,0) и назовите его Clock. Создайте три пустых дочерних объекта для него и назовите их Hours, Minutes и Seconds. Убедитесь, что все они также расположены в (0,0,0) .
Что такое GameObject (Игровой объект)?
В принципе, все, что находится в кадре является игровым объектом. Он имеет имя, тег, слой, компонент Transform и может быть помечен как статический. Сама по себе он ничего не делает, — это просто пустой контейнер. Вы можете превратить его в нечто полезное путем присоединения компонентов к нему или помещая в него другие объекты.
Что такое дочерний объект?
Если вы поместите объект внутрь другого (путем перетаскивания во вкладку Иерархия), то он считается потомком объекта, в котором он находится. Трансформация родителя наследуется его детьми и применяется в первую очередь. Таким образом позиция дочернего объекта задана как (10, 0, 0) , тогда как у родителя она (2, 1, 0) , а в итоге позиция дочернего объекта станет (12, 1, 0) . Но если вращение родителя также задано как (0, 0, 90) , дочерний объект вращается вокруг родителя и становится повернутым (0, 0, 90) на позиции (2, 11, 0) . Масштаб наследуется таким же образом.
Мы будем использовать простые коробки, чтобы визуализировать стрелки часов. Создайте дочерние кубы для каждой стрелки с помощью GameObject / Create Other / Cube. Задайте кубику Hours position (положение) (0, 1, 0) и scale (масштаб) (0.5, 2, 0.5) . Для куба minutes position будет (0, 1.5, 0) , а мосштаб (0.25, 3, 0.25) . Для куба seconds соответственно (0, 2, 0) и (0.1, 4, 0.1) .
Анимируем часы
Нам нужен скрипт для анимации часов. Создайте новый C# скрипт с помощью Create / C# Script во вкладке Project и назовите его ClockAnimator. Откройте скрипт и удалите все, что в нем есть, чтобы мы могли начать с чистого листа. Во-первых, мы указываем, что мы хотим использовать данные из пространства имен UnityEngine . После этого мы заявляем о существовании ClockAnimator. Мы описываем его как доступный для общественности class который наследует от MonoBehaviour .
Что такое пространство имен?
Это похоже на доменные имена веб-сайтов, но здесь речь идет о коде. Например, MonoBehaviour определяется внутри пространства имен UnityEngine и к нему можно обратиться через UnityEngine.MonoBehaviour .
Как и домены, пространства имен могут быть вложенными. Разница заключается в том, что записываются они наоборот. Поэтому вместо forum.unity3d.com следовало бы записать так: com.unity3d.forum. Например, тип ArrayList существует внутри пространства имен Collections , которое в свою очередь существует внутри пространства System . Поэтому, чтобы добраться до него, нужно написать System.Collections.ArrayList .
Объявив, что мы используем пространство имен, мы не должны писать его снова каждый раз, когда хотим использовать что-то из него. Так когда используем UnityEngine, то вместо того, чтобы писать UnityEngine. MonoBehaviour мы можем ограничиться MonoBehaviour.
Что такое class (класс)?
Класс (class ) – это некая программа, которая может быть использована для создания объектов, которые находятся в памяти вашего компьютера. Класс определяет, какие данные содержатся в объектах и как они себя ведут.
Что такое MonoBehaviour?
MonoBehaviour является классом из пространства имен UnityEngine . Если вы создаете класс, который вы хотите использовать в качестве компонента Unity, то он должен наследовать от MonoBehaviour. В нем содержится много полезных вещей, а еще он заставляет работать такие вещи как Update .
Это дает нам минимальный класс, который можно использовать для создания компонентов. Сохраните его, а затем присоедините к объекту Clock, перетащив из вкладки Project во вкладку Hierarchy (Иерархия), либо через кнопку Add Component (добавить компонент).
Чтобы анимировать стрелки, сперва нужно добраться до их компонентов Transform . Добавьте публичную переменную Transform для каждой стрелки скрипта, а затем сохраните. Эти переменные станут свойствами компонента, которые можно будет присвоить объекту в редакторе. Затем редактор соберет компоненты Transform из этих объектов и присвоит их нашим переменным. Выберите объект Clock и перетащите соответствующие объекты к новым свойствам.
Что такое переменная?
Переменная — это значение, которое может быть изменено. Оно может быть либо ссылкой на объект или чем-то простым вроде целого числа. Переменная должна быть определенного типа, который записывается перед ее именем, когда она задаtтся.
Переменные существуют только внутри облоасти видимости, в которой определены. По умолчанию, если переменная задана внутри класса (class), то каждый объект этого класса имеет собственную версию этой переменной. Однако, можно отметить их статичными (static), и в этом случае они будут существовать только для того класса (class), независимо от остальных объектов. Если переменная определена внутри метода, вы можете вспоминать о их существовании только когда метод вызывается.
Далее, мы добавим метод Update в скрипте. Это специальный метод, который будет вызываться один раз каждый кадр. Мы будем использовать его для вращения стрелок часов.
Что такое метод?
Метод представляет часть поведения, которое определяется в class. Он может принимать входные данные и выводить данные. Вход задается после названия метода, в кавычках, даже если его нет. Тип метода такой же, как и у его выхода. Если выхода нет, то это помечается как void.
По умолчанию, методы определяют поведение объектов, но можно определить поведение, которое не требует объекта для работы. Такие методы помечаются как static.
Shouldn’t Update be public ?
Update и набор других методов считаются особенностью Unity. Unity найдет их и вызовет их при необходимости, независимо от того, как мы их объявим.
Мы не должны объявлять метод Update публичным, потому что он не должен ссылаться на что-либо иное, кроме как на движок Unity. Философия состоит в том, чтобы сделать все приватным, и не нужно было к этому обращаться извне класса. Все, что приватное, не должно быть вперемешку с остальным. Это снижает вероятность ошибок.
Мы могли бы опустить private объявление, потому что методы и поля являются приватными по умолчанию. Я предпочитаю показывать все наглядно, поэтому специально так и делаю, а не просто говорю в двух словах.
После сохранения скрипта, редактор заметит, что наш компонент имеет метод update и покажет флажок, который позволяет нам вывести етключить его. Разумеется, он должен быть включен.
Каждый час часовая стрелка Hours должна вращаться 360/12 градусов. Стрелка Minutes поворачивается на 360/60 градусов каждую минуту. Наконец, стрелка Seconds поворачивается на 360/60 градусов каждую секунду. Определим эти значения как приватные константы с плавающей запятой для удобства.
Что особенного в const?
Ключевое слово const указывает на то, что значение никогда не изменится и не обязательно должно быть переменной. Его значение будет вычислено во время компиляции и вставлено везде, когда бы к нему не обратились.
Кстати, компилятор будет предварительно вычислить любое постоянное выражение, так что (1 + 1) и 2 дадут один и тот же результат
Каждое обновление нам нужно знать текущее время, чтобы эта фишка работала. Пространство имен System содержит DateTime struct, который подходит для этой работы. Он имеет статическое свойство с именем Now который всегда содержит текущее время. В каждом обновлении мы должны хранить его во временной переменной.
Что такое struct?
struct -это программа, также как и class. Различие в том, что всё, что она создает, обрабатывается как обычное значение, как целое число, а не как объект. У нее нет такого же распознания как у объекта.
Что такое свойство?
Свойство представляет собой метод, который претендует быть переменной. Оно может быть только для чтения или только для записи.
Обратите внимание, что переменные, обработанные редактором Unity также обычно называются свойствами, но это не то же самое.
Чтобы заставить стрелки двигаться, нужно изменить их местное вращение. Мы это сделаем, напрямую задавая стрелкам localRotation с помощью кватернионов. У Quaternion есть хороший метод, который можно использовать для определения произвольного вращения.
Т.к. мы смотрим на ось Z, а Unity использует левостороннюю систему координат, вращение по оси Z должно быть отрицательным.
Что такое кватернион?
Кватернионы основаны на комплексных числах и используются для обозначения 3D вращения. Хоть их и сложнее понимать, чем простые 3D-векторы, они имеют некоторые полезные характеристики. Пространство имен UnityEngine содержит Quaternion структуру.
Почему мы не используем rotation ?
localRotation ссылается непосредственно на вращение Transform , независимому от вращения своего родителя. Таким образом, если нам надо было бы повернуть объект Clock, его стрелки вращались бы вместе с ним.
rotation ссылается на итоговое вращение Transform т.к. на него мы и смотрим, учитывая вращение родителя. Стрелки не будут подстраиваться при вращении объекта Clock, т.к. его вращение будет компенсированным.
Улучшаем часы
Это работает! В режиме воспроизведения наши часы показывают текущее время, тем не менее, они ведут себя так же, как цифровые часы, поскольку показывает только дискретные шаги. Давайте включим возможность показивать аналоговое время. Добавьте публичную логическую переменную analog в скрипт и использовать ее, чтобы определить, что делать в методе Update. Мы можем переключать это значение в редакторе даже в режиме воспроизведения.
Для аналогового варианта нам нужен несколько иной подход. Вместо DateTime.Now мы будем использовать DateTime.Now.TimeOfDay , которая представляет собой TimeSpan . Это позволяет нам легко получать доступ к дробным долям прошедших часов, минут и секунд. Эти значения представлены как двойные, т.е. значения с двойной точностью и плавающими запятыми, нам надо разделить их на две части.
Что такое кастинг?
Кастинг изменяет тип значения. Вы указываете это, написав тип в круглые скобки перед значением. Изменение простых значений дает нам такой переход, как переход от значения с плавающей запятой в целое число, отсекая дробную часть.
Кастинг объекта не изменяет его, а только меняет то, как будет обрабатываться ссылка. Этим лучше заниматься только когда вы на 100% уверены в типе объекта.
Теперь наши часы работают подобно аналогичным! Скачать unitypackage.
Источник