Version: 6000.3
语言: 中文
管理时间和帧速率
修复更新

每帧更新

Unity 每帧执行一次更新。您的单一行为脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
可以通过MonoBehaviour.Update方法。例如,在游戏角色的Update方法,您可以从游戏手柄读取用户输入,并将字符向前移动一定量。在处理此类基于时间的作时,请务必记住,游戏的帧速率可能会有所不同,因此之间的时间长度也会有所不同Update通话也各不相同。

游戏的可变帧率通常表示为秒帧数正在运行的游戏中显示连续帧的频率。更多信息
请参阅术语表
FPS查看第一人称射击游戏,每秒帧数。
请参阅术语表
.帧速率根据主机设备的功能以及绘制每一帧所需的图形和计算的复杂性等因素而变化。例如,当屏幕上有 100 个活动角色时,您的游戏运行帧速率可能会比只有一个角色时慢。

除非受到质量设置自适应性能包的限制,否则 Unity 会尝试以尽可能快的帧速率运行游戏。您可以在执行顺序图Game Logic 部分查看每帧发生的情况的更多详细信息。

考虑逐渐向前移动对象的任务,一次一帧。乍一看,你似乎可以每帧平移一个固定的距离:

//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.targetFrameRateQualitySettings.vSyncCount 设置应用程序的帧速率。有关详细信息,请参阅 Application.targetFrameRate API 文档

其他资源

管理时间和帧速率
修复更新