1 回答
TA贡献1744条经验 获得超4个赞
你在向量 3 的 y 方向得到了速度 x
if (Direction == "U")
{
rb.velocity = new Vector3(rb.velocity.x, DragonSpeed * MoveUp);
}
if (Direction == "D")
{
rb.velocity = new Vector3(rb.velocity.x, DragonSpeed * MoveDown);
}
当您覆盖后续语句中的值时,它在您的播放器脚本中起作用。
float MoveSide = Input.GetAxis("Horizontal"); //eg 1
float MoveVert = Input.GetAxis("Vertical"); // eg 1
// setting your x velocity incorrectly to the y (vert) velocity speed and keeping y the same velocity as start of frame
rb.velocity = new Vector3(Speed * MoveVert, rb.velocity.y);
// Set the y to the x value of the statement above so it is now in the correct vector and set the x to the correct hoz velocity
rb.velocity = new Vector3(Speed * MoveSide, rb.velocity.x);
// effectively doing
rb.velocity = new Vector3(Speed * MoveSide, Speed * MoveVert);
您还应该使用 MovePosition,因为它不会直接影响物理引擎(使用速度可能会对碰撞和触发器产生连锁反应并产生意想不到的物理效果)。您的游戏对象必须被标记为运动学,否则下面的内容将导致它们立即传送到新位置。
var movementDirection = new Vector3(Speed * MoveSide, Speed * MoveVert);
rb.MovePosition(transform.position + movementDirection * Time.deltaTime);
并且 * Time.deltaTime 确保移动对于不同的帧率是一致的。如果您在 30 fps 的机器上运行游戏,游戏对象的移动速度将低于 60 fps。Time.deltaTime 计算自上一帧以来经过的物理时间,并确保无论帧速率如何,行进的距离都是相同的。
例如,假设游戏对象每帧更新移动 1 次。在 30 fps 的机器上一秒钟后,物体将移动 30。在 60 fps 的机器上一秒钟后,物体将移动 60。
Time.deltaTime=.2s on 30 fps so 1 movement * .2 = move .2 per frame * 30 frames in the second = 60 moved
Time.deltaTime=.1s on 60 fps so 1 movement * .1 = move .1 per frame * 60 frames in the second = 60 moved
- 1 回答
- 0 关注
- 132 浏览
添加回答
举报