转载文章:

Unity3d-通过简单示例来理解Time.deltaTime

2018年04月21日 18:04:14 Black_Window 阅读数:926 标签: UnityTime 更多

个人分类: Unity
 

在初学Unity3d时就不时会用上Time.deltaTime这个变量,初学Unity时不是很懂这个这个变量,那时的理解仅限于“要让数值按每秒多少进行变化时把数值乘以它就对了”

这么理解它其实也不算错

下面来简单理解这个变量,我们先看看Unity官方手册中对这个变量的描述(网址:https://docs.unity3d.com/ScriptReference/Time-deltaTime.html)

Unity3d-通过简单示例来理解Time.deltaTime-LMLPHP

官方手册中说明:这个变量是按秒为单位,完成上一帧所用的时间。(只读。)

首先,这就意味着Time.deltaTime是一个变量,而不是一个常量,我想许多游戏玩家都会明白,一个游戏的FPS(游戏运行时每秒所运行的帧数)总是在变化的,FPS会因为电脑配置、场景变化或者游戏画面质量的设置而改变,总之,在玩游戏的时候,FPS是在不断变化的,可能配置高电脑FPS很稳定,但也会有变化时候

而Unity中,在每个新创建的C#脚本中都会有一个Update()方法,这个方法是每一帧都会运行一次的,如果我们在Update()方法简单设置一个物体的位移“transform.translate(new vector3(1,0,0))”,那么就意味着这个物体每一帧向X轴正方向移动1个单位的距离,这样一来,当游戏运行时,假设FPS稳定在60帧,那么就意味着这个物体每秒向X轴正方向移动60个单位,而当游戏环境发生变化,FPS降到30帧时,游戏物体就只能每秒向X轴正方向移动30个单位了

显然,一般情况下,我们是不希望数值这样变化的

因此,使用Time.deltaTime这个变量就显得十分重要,这个变量是指完成上一帧所用的时间,那么假设当游戏的FPS稳定为50帧时,Time.deltaTime的值则为0.02秒,而当FPS降低或者上升时,即使改变的很剧烈,也会有个过渡时间,假设FPS从50帧在一秒的时间里降到了25帧,那么Time.deltaTime这个变量也会跟着变化的剧烈程度从0.02秒升到0.04秒

假设,一个游戏开始时FPS只有5帧(方便计算),游戏的某个脚本的Update()方法有一个物体位移函数transform.translate(new vector3(1*Time.deltaTime,0,0)),之后FPS逐渐降到了1帧,那么降低的过程中,Time.deltaTime的变化将是这样的:

完成第一帧用了0.2秒,因此之后Time.deltaTime=0.2秒,

完成第二帧时,FPS已经降到了4帧,因此用了0.25秒,于是之后Time.deltaTime=0.25秒,

完成第三帧时,FPS已经降到了3帧,因此用了0.33秒,于是之后Time.deltaTime=0.33秒,

完成第四帧时,FPS已经降到了2帧,因此用了0.5秒,于是之后Time.deltaTime=0.5秒,

完成第五帧时,FPS已经降到了1帧,因此用了1.0秒,于是之后Time.deltaTime=1.0秒。

于是,完成第一帧时,物体向X轴正方向移动了1*0.2=0.2个单位,用时0.2秒,

完成第二帧时,物体向X轴正方向移动了1*0.2=0.2个单位,用时0.25秒,

完成第三帧时,物体向X轴正方向移动了1*0.25=0.25个单位,用时0.33秒,

完成第四帧时,物体向X轴正方向移动了1*0.33=0.33个单位,用时0.5秒,

完成第五帧时,物体向X轴正方向移动了1*0.5=0.5个单位,用时1.0秒.

上面的假设中,物体在2.28秒的时间里移动了1.48个单位,尽管与1单位/秒的速度有很大距离,但这里用的帧数是5帧降到1帧,当帧数为60帧甚至更高,改变幅度变小,物体的位移速度是可以约等于1单位/秒的。

以上假设只是为了方便理解,实际情况会更加复杂。

所以,当你在Update()方法中将transform.translate(new vector3(1,0,0))更改成transform.translate(new vector3(1*Time.deltaTime,0,0))后,这个物体的位移就基本能按每秒一个单位的速度向X轴正方向进行位移

当然,Unity中还有FixedUpdate()方法,不过这里只讲到Update()方法;

以上为我对Time.deltaTime的简单理解,如有不正确的地方,还望指教

05-11 13:21