为什么按增量时间计算?

Why times by delta time?

我正在使用 unity 制作游戏并使一些对象原地旋转。我四处寻找如何实现这一目标并找到了方法。 --->

 public class Rotator : MonoBehaviour {

 int speed = 2;

// Update is called once per frame
void Update () {

    transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime *speed);

  }
}

现在我的问题是,为什么我必须做“* Time.deltaTime”?请解释这一整行。

谢谢, 罗

时间增量通常是每个游戏循环更新或绘制周期之间的时间差。它允许游戏循环/绘制周期事件独立于 CPU 速度发生(动画和事件不会根据系统资源/CPU 速度加速或减速)。

我们这些足够大的人还记得游戏没有这样做的时候。有些游戏 运行 频率更高 CPUs 会快很多。 Oregon Trail 就是一个很好的例子。

帧率无关游戏是运行 以相同速度运行的游戏,无论帧率如何。例如,一款游戏可能 运行 在慢速计算机上以 30 FPS(每秒帧数)的速度运行,而在快速计算机上以 60 FPS 的速度运行。独立于帧率的游戏在两台计算机上以相同的速度进行(对象似乎以相同的速度移动)。另一方面,帧速率相关的游戏在慢速计算机上以一半的速度进行,具有某种 slow-motion 的效果。制作帧率无关的游戏对于确保您的游戏对每个人来说都是有趣和可玩的很重要,无论他们拥有什么样的计算机。当帧率下降时游戏变慢会严重影响游戏玩法,让玩家感到沮丧并退出! 所以这 Time.deltaTime 使运动帧率独立。

在您的示例中,为了使 transform 以所需的 speed 旋转,它必须每帧旋转少量。将所有这些小的旋转放在一起可以得到您正在寻找的完整旋转,达到您想要的 speed

Time.deltaTime 是自上一帧以来的时间(即自 Update() 之前被调用以来的时间)。

要了解为什么必须使用 Time.deltaTime,首先您需要了解游戏引擎的高级流程。

基本上,游戏是一种需要不断等待玩家输入并对输入做出反应并渲染场景的应用程序。每个游戏的核心都有一个游戏循环,只要应用程序 运行,它就会处于活动状态。可以这么简单:

while(active) 
{
  update(); // react to player's input/update player position etc
  render(); // render the scene
}

如您所见,循环内的代码一直在执行,直到玩家的操作导致循环终止(也许他从游戏菜单中单击了 'Quit')。在 Unity 中,在游戏循环中调用附加到所有游戏对象的所有脚本的更新。

根据应用程序 运行 所在的机器,在给定的时间范围内可能会有不同数量的更新通过,例如您可以根据机器配置使用不同的帧速率。如果您无法以某种方式将所有更新同步到实际物理时间,这真的会把事情搞砸。

为此,您在 Unity 脚本中使用 Time.DeltaTime。这只是一个参数,它告诉您自上次调用脚本的更新以来已经过去了多长时间。

为了具体回答您的问题,将旋转更新与 deltaTime 相乘是一种确保对象的旋转速度相同而不管帧率如何的方法。

Time.deltaTime用于使动作与帧率无关。无论 fps 如何,这行代码在所有设备上的工作方式都相似。因此,在这里,您的对象将在固定时间内在所有设备中旋转相似的度数。

for transform.Rotate(new Vector3(1, 0, 0) * Time.deltaTime *speed); 假设 fps 是 60(1 秒内 60 帧)。每帧的时间为 0.016666666。物体1秒旋转2个单位(0.0166666*60帧*2(其中2为速度)

如果fps为30,即一秒30帧,则每帧时间为0.03333。物体1秒旋转2个单位(0.033333*30帧*2(其中2为速度)

为了更好地理解,请阅读以下内容link: http://codesaying.com/time-deltatime-in-unity3d/

Time.DeltaTime 是一种确保对象的 speed/move/rotation 与帧率无关的方法。

public class Test : MonoBehaviour
{
    const int moveSpeed = 1;
    public float currentX = 0;

    void Update()
    {
        var moveSize = Time.deltaTime * moveSpeed;
        currentX += moveSize;
    }
}

如果我们写出实际值(为简单起见,我们将 Time.deltaTime 设置为常数):

总结:

  1. Time.deltaTime 的值越小,帧数越多,移动量越小 (moveSize)
  2. Time.deltaTime 的值越大,帧数越少,但移动量越大(moveSize)

无论时间如何,它们仍然都达到相同的 currentX 值。这适用于更大和更小的 Time.deltaTime.