Unity 每帧执行一些更新。您的 MonoBehaviour 脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性,以及以任何您喜欢的方式响应用户输入。 更多信息
参见 术语表 可以通过 MonoBehaviour.Update
方法挂接到此更新循环中。例如,在游戏角色的 Update
方法中,您可以读取操纵杆的用户输入,并向前移动角色一段距离。在处理此类基于时间的操作时,务必记住游戏的帧率可能会有所不同,因此 Update
调用之间的时间长度也会有所不同。
游戏的可变帧率通常以 每秒帧数正在运行的游戏中连续帧显示的频率。 更多信息
参见 术语表 或 FPS参见第一人称射击游戏、每秒帧数。
参见 术语表 表示。帧率因主机设备的功能以及绘制每一帧所需的图形和计算复杂度等因素而异。例如,当有 100 个活动的角色显示在屏幕上时,您的游戏运行的帧率可能比只有一个角色时慢。
除非您的 质量设置 或 自适应性能包 对其进行了限制,否则 Unity 会尝试以尽可能快的帧率运行您的游戏。您可以在 执行顺序图 的“游戏逻辑”部分中查看每帧发生情况的更多详细信息。
考虑逐帧逐渐向前移动对象的任务。最初,您可能认为可以每帧将对象平移固定距离
//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 文档。