为什么按时间增加时间?

时间:2016-01-11 21:24:33

标签: c# unity3d time timedelta

我使用统一制作游戏并使某些物体旋转到位。我四处寻找如何完成这项工作并找到了解决方法。 --->

 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"?请解释这一行。

谢谢你, 罗

6 个答案:

答案 0 :(得分:5)

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

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

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

正如你所看到的那样,循环中的代码一直被执行,直到玩家的动作导致循环终止(也许他点击了游戏菜单中的退出')。在Unity中,在游戏循环中调用附加到所有游戏对象的所有脚本的更新。

根据应用程序运行的机器,在给定的时间范围内可以有不同数量的更新过程,例如,您可以根据机器配置获得不同的帧速率。如果您没有办法将所有更新以某种方式与实际物理时间同步,这将会让事情变得更糟。

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

要专门回答您的问题,请将旋转更新与deltaTime相乘,以确保无论帧速率如何,对象的旋转速度都相同。

答案 1 :(得分:1)

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

我们这些年龄足够大的人可以记住游戏没有这样做的时间。对于频率较高的CPU,有些游戏会运行得更快。俄勒冈小径就是一个很好的例子。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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是速度)

为更好地理解,请访问以下链接: http://codesaying.com/time-deltatime-in-unity3d/

答案 5 :(得分:0)

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设置为常数):

Example1

Example2

Example3

摘要:

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

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