Описание
Независимое от частоты кадров сообщение MonoBehaviour.FixedUpdate для физических расчетов.
MonoBehaviour.FixedUpdate имеет частоту физической системы; это называется каждым кадром с фиксированной частотой кадров. Выполнять системные вычисления Physics после FixedUpdate. 0,02 секунды (50 вызовов в секунду) — это время между вызовами по умолчанию. Используйте Time.fixedDeltaTime для доступа к этому значению. Измените его, установив желаемое значение в скрипте, или перейдите в раздел Edit > Settings > Time > Fixed Timestep
и задайте его там. Частота FixedUpdate больше или меньше частоты Update. Если приложение работает со скоростью 25 кадров в секунду (fps), Unity вызывает его примерно два раза за кадр. В качестве альтернативы, 100 кадров в секунду вызывает примерно два кадра рендеринга с одним FixedUpdate. Управляйте требуемой частотой кадров и частотой Fixed Timestep
в настройках Time
. Используйте Application.targetFrameRate, чтобы установить частоту кадров.
Используйте FixedUpdate при использовании Rigidbody. Установите силу Rigidbody, и она будет применяться к каждому фиксированному кадру. FixedUpdate происходит на измеренном временном шаге, который обычно не совпадает с MonoBehaviour.Update.
В следующем примере количество вызовов Update сравнивается с количеством вызовов FixedUpdate. FixedUpdate выполняется 50 раз в секунду. (Код игры работает со скоростью около 200 кадров в секунду на тестовой машине.).
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Пример GameObject.FixedUpdate.
//
// Измеряем частоту кадров, сравнивая FixedUpdate с Update.
// Показывать ставки каждую секунду.
public class ExampleScript : MonoBehaviour
{
private float updateCount = 0;
private float fixedUpdateCount = 0;
private float updateUpdateCountPerSecond;
private float updateFixedUpdateCountPerSecond;
void Awake()
{
// Если это раскомментировать, частота кадров снизится до 10 кадров в секунду.
// Это будет означать, что FixedUpdate вызывается чаще, чем Update.
//Application.targetFrameRate = 10;
StartCoroutine(Loop());
}
// Увеличить количество вызовов Update.
void Update()
{
updateCount += 1;
}
// Увеличить количество вызовов FixedUpdate.
void FixedUpdate()
{
fixedUpdateCount += 1;
}
// Показать количество обращений к обоим сообщениям.
void OnGUI()
{
GUIStyle fontSize = new GUIStyle(GUI.skin.GetStyle("label"));
fontSize.fontSize = 24;
GUI.Label(new Rect(100, 100, 200, 50), "Update: " + updateUpdateCountPerSecond.ToString(), fontSize);
GUI.Label(new Rect(100, 150, 200, 50), "FixedUpdate: " + updateFixedUpdateCountPerSecond.ToString(), fontSize);
}
// Обновлять оба значения CountsPerSecond каждую секунду.
IEnumerator Loop()
{
while (true)
{
yield return new WaitForSeconds(1);
updateUpdateCountPerSecond = updateCount;
updateFixedUpdateCountPerSecond = fixedUpdateCount;
updateCount = 0;
fixedUpdateCount = 0;
}
}
}