在unity生命周期函数中有这么两个方法
void Update()
{
}
void FixedUpdate()
{
}
其中update在每一帧执行。而fixedupdate在每个固定时间执行,初始为0.02(秒),就是说每隔0.02秒会执行一次FixedUpdate方法。这个时间可以通过编辑器菜单栏Editor->Project Setting ->Time -> Fixed TimeStep来修改。
由于每个机器的性能不一样,因此同样的画面,在不同的手机上运行产生的帧率会是不一样的,因此update执行的间隔就会不那么的固定,可能第一帧执行花费了0.02秒,第二帧可能花费0.03秒不等。
如果我们想要一个物体在1秒单位时间内移动10个单位距离,假定方向为朝x轴正方面,在fixedupdate中,如果fixedupdate的间隔时间为0.02,那么1秒会执行50次,所以每次移动的距离为10/50。代码可以这样写
void FixedUpdate()
{
transform.Translate(Vector3.right * 10 / 50);
}
那么在1秒中,这个方法会执行50次。也就是移动了Vector3.right * 10 / 50 *
50 = Vector3.right * 10。即10个单位距离。
如果我们想在update中实现1秒中移动10的单位距离该怎么办呢。这个时候就需要用到Time.deltatime了。方法如下
void Update()
{
transform.Translate(Vector3.right * 10 *Time.deltatime );
}
怎么理解呢,因为帧率是会浮动的,所以我们并不能确切的知道1秒内会执行多少帧,因此并不能算出每帧需要移动的距离。所以unity引入了增量时间Time.deltatime。你可以这样想象,把Time.deltatime理解成,在1秒内,刷新了N帧,但是每帧的时间是不固定的,所以Unity用Time.deltatime表示每1帧所花费的时间。那么1秒内会执行N次update,就会产生N个Time.deltatime,每个Time.deltatime的时间可能都不一样。但是1秒内的N个Time.deltatime加起来一定会等于1。也就是说在1秒内移动了
Vector3.right * 10 * Time.deltatime1+Vector3.right * 10 * Time.deltatime2 + ...+ Vector3.right * 10 * Time.deltatimeN
= Vector3.right * 10 * (Time.deltatime1 + Time.deltatime2 + ... + Time.deltatimeN)
= Vector3.right * 10 * 1
即1秒内移动Vector3.right * 10。即10个单位距离。