Unity 6.3
0 онлайн 25 гостей 3 в системе
Вход

Обновления по кадрам

Unity выполняет некоторые обновления один раз в кадре. Ваши MonoBehaviour скрипты могут подключаться к этому циклу обновления через методы MonoBehaviour.Update. Например, в методе Update вашего игрового персонажа вы можете прочитать пользовательский ввод с джойстика и переместить персонажа вперед на определенное расстояние. Важно помнить при обработке действий, основанных на времени, как это, что частота кадров игры может варьироваться, и поэтому продолжительность времени между вызовами Update также варьируется.

Переменная частота кадров игры часто выражается в кадрах в секунду, или FPS. Частота кадров варьируется в зависимости от таких факторов, как возможности хост-устройства и сложность графики и вычислений, необходимых для отображения каждого кадра. Например, ваша игра может работать с более низкой частотой кадров, когда на экране есть 100 активных персонажей, чем когда на экране есть только один персонаж.

Если иное не ограничено вашим настройки качества или Адаптивная производительность, Unity пытается запустить игру на самой быстрой частоте кадров возможно. Вы можете увидеть больше деталей о том, что происходит каждый кадр в Game Логика раздела бюджета Диаграмма порядка исполнения.

Рассмотрим задачу перемещения объекта вперед постепенно, по одному кадру за раз. Поначалу может показаться, что вы можете просто переместить объект на фиксированное расстояние в каждом кадре:

//C# script example
using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public float distancePerFrame;
    
    void Update() {
        transform.Translate(0, 0, distancePerFrame); // this is incorrect
    }
}

Однако при этом коде, по мере изменения частоты кадров, изменяется и видимая скорость объекта. Если игра работает на частоте 100 FPS, объект перемещается distancePerFrame 100 раз в секунду. Но если частота кадров замедляется до 60 FPS (например, из-за нагрузки CPU), то он движется вперед только 60 раз в секунду и, следовательно, проходит меньшее расстояние за то же время.

В большинстве случаев это нежелательно, особенно в играх и анимации. Намного более распространено, чтобы ваши игровые объекты двигались с постоянной и предсказуемой скоростью независимо от частоты кадров. Решение заключается в масштабировании количества движения каждого кадра на количество времени, прошедшего за каждый кадр, что вы можете прочитать из свойства Time.deltaTime:

//C# script example
using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public float distancePerSecond;
    
    void Update() {
        transform.Translate(0, 0, distancePerSecond * Time.deltaTime);
    }
}

Обратите внимание, что движение теперь указывается как distancePerSecond, а не distancePerFrame. Поскольку частота кадров меняется, размер шага движения будет меняться соответственно, и поэтому скорость объекта будет постоянной.

В зависимости от целевой платформы, используйте либо Application.targetFrameRate или QualitySettings.vSyncCount для установки частоты кадров приложения. Дополнительные сведения см. в документации Application.targetFrameRate API.

Дополнительные ресурсы