向前和侧身球员运动
Forward and Sideways Player movement
所以我和我的朋友正在开发一款游戏,您可以在其中玩雪球,从山上滚下,避开障碍物。然而,我们的行动遇到了麻烦。我们希望我们的雪球越大速度越快,并且在不撞到任何东西的情况下运行的时间越长。我们的前进运动由
控制
void FixedUpdate(){
rb.velocity += Physics.gravity * 3f * rb.mass * Time.deltaTime;
//to accelerate
rb.AddForce(0, 0, 32 * rb.mass);
}
我们正在对按键输入施加侧向力
if (Input.GetKey(ControlManager.CM.left))
{
if (rb.velocity.x >= -15 - (rb.mass * 8))
{
rb.AddForce(Vector3.left * sidewaysForce * (rb.mass * .5f), ForceMode.VelocityChange);
}
}
if (Input.GetKey(ControlManager.CM.right))
{
if (rb.velocity.x <= 15 + (rb.mass * 8))
{
rb.AddForce(Vector3.right * sidewaysForce * (rb.mass * .5f), ForceMode.VelocityChange);
}
}
质量随着规模的增加而增加,反之亦然。
当滚雪球大于一定比例时就会出现问题。一旦达到该点,它就会在您按下按键时左右大幅加速,然后在您放开按键时迅速恢复到前进速度。我认为这与质量和施加的力复合的方式有关。
有没有更好的办法让我们的雪球加速下坡或者左右移动呢?我试过 transform.Translate 和 transform.MovePosition,但它们会导致左右移动不稳定。
首先,大多数移动代码应该将速度乘以 Time.deltaTime
。在一个假设的游戏中,如果你每帧增加一定量的速度,那么拥有强大的 60 fps 计算机的人将比一个可怜的 30 fps 笔记本电脑游戏玩家快两倍,因为他们加速的频率较低。为了解决这个问题,我们将加速度乘以 Time.deltaTime
,这是自上一帧以来的时间。
代替此代码,帧率将决定速度;
Vector3 example = new Vector3(1,1,1);
void Update()
{
rb.AddForce(example);
}
我们将使用此代码。如果帧率是原来的一半,Time.deltaTime
将是原来的两倍,所以每个人的加速度都是恒定的。
Vector3 example = new Vector3(1,1,1);
void Update()
{
rb.AddForce(example * Time.deltaTime);
}
这个问题可能还有另一个来源,尽管摆脱帧率依赖是一个很好的起点。看起来您已经将 Time.deltaTime
用于向下速度,但没有用于横向移动。即使不能解决问题,使用 Time.deltaTime 对于任何一致的游戏来说都是必不可少的。
所以我和我的朋友正在开发一款游戏,您可以在其中玩雪球,从山上滚下,避开障碍物。然而,我们的行动遇到了麻烦。我们希望我们的雪球越大速度越快,并且在不撞到任何东西的情况下运行的时间越长。我们的前进运动由
控制void FixedUpdate(){
rb.velocity += Physics.gravity * 3f * rb.mass * Time.deltaTime;
//to accelerate
rb.AddForce(0, 0, 32 * rb.mass);
}
我们正在对按键输入施加侧向力
if (Input.GetKey(ControlManager.CM.left))
{
if (rb.velocity.x >= -15 - (rb.mass * 8))
{
rb.AddForce(Vector3.left * sidewaysForce * (rb.mass * .5f), ForceMode.VelocityChange);
}
}
if (Input.GetKey(ControlManager.CM.right))
{
if (rb.velocity.x <= 15 + (rb.mass * 8))
{
rb.AddForce(Vector3.right * sidewaysForce * (rb.mass * .5f), ForceMode.VelocityChange);
}
}
质量随着规模的增加而增加,反之亦然。
当滚雪球大于一定比例时就会出现问题。一旦达到该点,它就会在您按下按键时左右大幅加速,然后在您放开按键时迅速恢复到前进速度。我认为这与质量和施加的力复合的方式有关。
有没有更好的办法让我们的雪球加速下坡或者左右移动呢?我试过 transform.Translate 和 transform.MovePosition,但它们会导致左右移动不稳定。
首先,大多数移动代码应该将速度乘以 Time.deltaTime
。在一个假设的游戏中,如果你每帧增加一定量的速度,那么拥有强大的 60 fps 计算机的人将比一个可怜的 30 fps 笔记本电脑游戏玩家快两倍,因为他们加速的频率较低。为了解决这个问题,我们将加速度乘以 Time.deltaTime
,这是自上一帧以来的时间。
代替此代码,帧率将决定速度;
Vector3 example = new Vector3(1,1,1);
void Update()
{
rb.AddForce(example);
}
我们将使用此代码。如果帧率是原来的一半,Time.deltaTime
将是原来的两倍,所以每个人的加速度都是恒定的。
Vector3 example = new Vector3(1,1,1);
void Update()
{
rb.AddForce(example * Time.deltaTime);
}
这个问题可能还有另一个来源,尽管摆脱帧率依赖是一个很好的起点。看起来您已经将 Time.deltaTime
用于向下速度,但没有用于横向移动。即使不能解决问题,使用 Time.deltaTime 对于任何一致的游戏来说都是必不可少的。