Time.deltaTime是Unity的一个本地变量,表示了在这一帧时,距离上一帧所花费的时间,简单来说就是你现在的电脑,在现在这个程序运行状态下,每一帧需要多长时间,这个数字是随时变化的,每一帧肯定都是不相同的,而数值单位是秒。
之所以有这个变量出现的主要原因是,在Unity3D里,Update()是每帧刷新一次的,所以你如果把某个效果,比如运动效果写到了Update()里,那得到的结果是每一帧移动了多少,而不是每一秒移动了多少。同时因为帧率不是恒定不变的,导致了你其实是很难在Update()里写出来一个匀速运动的。
所以就有了Time.deltaTime这个补偿机制。
比如下面的代码写到的:
1 | transform.translate(new vector3(1,0,0)) |
这段代码如果放到了Update()里面执行,就是每一帧的坐标往X轴的正方向移动了1个单位,如果你的FPS是30,那么一秒就移动30个单位,你的FPS是120,那么一秒就移动了120个单位,这点肯定是游戏开发者不想看到的。
所以在这种情况下,只要用你需要移动的距离 *Time.deltaTime,得到的结果就是每秒移动的距离。
上面代码就可以写成:1
transform.translate(new vector3(1*Time.deltaTime,0,0))
假设你电脑这个时候的Time.deltaTime是0.1,那么这一帧的移动就用掉了0.1秒,下一帧的Time.deltaTime是0.12,那么下一帧的移动就用掉了0.12秒。相当于是把1秒里面的移动,通过*Time.deltaTime拆分到了每一帧里。
这样每一帧都用这个变量矫正了一次以后,就形成了匀速运动。
当然解决这个问题也可以把运动写到FixedUpdate(),但在某些情况下,写在Update()里还是更方便一些。
下面是官方提供的事例代码。1
2
3
4
5
6
7
8
9using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
void Update() {
float translation = Time.deltaTime * 10;
transform.Translate(0, 0, translation);
}
}