【问题标题】:Forward and Sideways Player movement向前和横向球员运动
【发布时间】:2021-02-18 15:14:33
【问题描述】:

因此,我和我的朋友们正在开发一款游戏,您可以在其中玩雪球滚下山坡,避开障碍物。然而,我们的运动遇到了麻烦。我们希望我们的雪球越快越快,越长越不会撞到任何东西。我们的前进是由

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,但它们会导致左右移动不连贯。

【问题讨论】:

    标签: unity3d game-physics


    【解决方案1】:

    首先,大多数运动代码应该将速度乘以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 对于任何一致的游戏都是必不可少的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多