版本: Unity 6 (6000.0)
语言英语
  • C#

MonoBehaviour.FixedUpdate()

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们会阅读用户提供的每项建议更改,并在适用时进行更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请<a>稍后重试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

切换到手册

描述

与帧速率无关的 MonoBehaviour.FixedUpdate 消息,用于物理计算。

MonoBehaviour.FixedUpdate 具有物理系统的频率;它在每个固定帧速率帧中调用。在 FixedUpdate 后计算 Physics 系统计算。默认情况下,调用之间的时间间隔为 0.02 秒(每秒 50 次调用)。使用 Time.fixedDeltaTime 访问此值。通过在脚本中将它设置为您首选的值来更改它,或者导航到 Edit > Settings > Time > Fixed Timestep 并设置它。FixedUpdate 的频率高于或低于 Update。如果应用程序以每秒 25 帧 (fps) 的速度运行,Unity 约每帧调用它两次。或者,100 fps 会导致大约两个渲染帧,其中一个 FixedUpdate。从 Time 设置中控制所需的帧速率和 Fixed Timestep 速率。使用 Application.targetFrameRate 设置帧速率。

使用 FixedUpdate 时使用 Rigidbody。对 Rigidbody 设置一个力,它将在每个固定帧中应用。FixedUpdate 在一个测量的步长时间内发生,通常不会与 MonoBehaviour.Update 重合。

在以下示例中,比较了 Update 调用的次数与 FixedUpdate 调用的次数。 FixedUpdate 每秒执行 50 次。 (游戏代码在测试机器上以大约 200 fps 的速度运行。)

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; } } }