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

MonoBehaviour.FixedUpdate()

Описание

Обновление вызывает регулярные, фиксированные интервалы как часть цикла обновления физики Unity.

Интервал между вызовами определяется значением Time.fixedDeltaTime. Вы можете изменить это значение в коде или обновив значение Fixed Timestep в Unity Editor's Настройки времени. По умолчанию это 0.02 секунд (50 вызовов в секунду).

Используйте FixedUpdate для выполнения вычислений физики системы. Например, используйте FixedUpdate при применении силы к Rigidbody.

В отличие от MonoBehaviour.Update, который вызывают один раз на каждый рендируемый кадр, FixedUpdate может быть вызван нулевой, один или несколько раз на кадр в зависимости от частоты кадров и потребностей симулирования. Это обеспечивает, что физические вычисления остаются последовательными и детерминированными, независимо от того, насколько быстро игра рендирует кадры. Используйте Application.targetFrameRate для установки целевой частоты кадров. Для получения дополнительной информации об управлении изменениями частоты кадров см. Обработка изменений во времени.

В следующем примере сравнивается количество вызовов Update с количеством вызовов FixedUpdate.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// GameObject.FixedUpdate example. // // Measure frame rate comparing FixedUpdate against Update. // Show the rates every second.

public class ExampleScript : MonoBehaviour { private float updateCount = 0; private float fixedUpdateCount = 0; private float updateUpdateCountPerSecond; private float updateFixedUpdateCountPerSecond;

void Awake() { // Uncommenting this will cause framerate to drop to 10 frames per second. // This will mean that FixedUpdate is called more often than Update. //Application.targetFrameRate = 10; StartCoroutine(Loop()); }

// Increase the number of calls to Update. void Update() { updateCount += 1; }

// Increase the number of calls to FixedUpdate. void FixedUpdate() { fixedUpdateCount += 1; }

// Show the number of calls to both messages. 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); }

// Update both CountsPerSecond values every second. IEnumerator Loop() { while (true) { yield return new WaitForSeconds(1); updateUpdateCountPerSecond = updateCount; updateFixedUpdateCountPerSecond = fixedUpdateCount;

updateCount = 0; fixedUpdateCount = 0; } } }