向前和侧身球员运动

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 对于任何一致的游戏来说都是必不可少的。