在一些2D游戏里通过Rigidbody2D的velocity进行人物的移动中会使用下面类似的格式
public PlayerInputControl inputControl;
public Vector2 inputDirection;
public Rigidbody2D playerRigidbody;
//人物速度
public float speed;
public void Move()
{
playerRigidbody.velocity = new Vector2(inputDirection.x * speed * Time.deltaTime, playerRigidbody.velocity.y);
}
通常我们会引入一个Time.deltaTime来防止因为不同设备性能的问题导致速度不同
为什么要传入一个Time.deltaTime?
当你在移动物体时,乘以 Time.deltaTime
会使移动速度与时间间隔成比例,从而使得不同帧率下物体的移动表现一致。这是因为 Time.deltaTime
反映了两帧之间的时间间隔,当你乘以它时,实际上是将你的速度调整为“每秒移动多少单位”,而不是“每帧移动多少单位”。
举个例子,假设你有一个速度值为 10,你希望物体每秒移动 10 个单位。如果游戏帧率为 60 FPS,那么在每一帧中,物体将移动 10 * (1/60) = 0.1667
个单位。如果游戏帧率为 30 FPS,则物体将移动 10 * (1/30) = 0.3333
个单位。
假设一个设备上帧率为n(即一秒钟n帧),如果只是单纯speed(假设为10),本来你想让他一秒钟移动10个单位,但是由于帧数的原因(一秒钟运行n次move函数)最终移动了10(即speed)*n个单位,所以我们需要引入一个1/n将帧数所带入的原因消除掉,故引入了 Time.deltaTime
。
通过乘以 Time.deltaTime
,你实际上使物体在每一帧中移动的距离与时间间隔成比例,从而使得不同帧率下物体的移动速度是一致的。因此,乘以 Time.deltaTime
是为了使得移动在不同的帧率下都保持一致。