首页 > 解决方案 > 跳跃增加移动速度

问题描述

我正在使用球物理和 FPS 相机制作游戏。我有这个错误,当我跳跃时玩家的移动会增加。

例子:

在平面上沿 Z 轴运行:

z轴速度为~3.75

突然跳起来:

z速度增加到5,它实际上变得更高了

我的代码:

void Update()
{
    // Input
    moveFwrd = Input.GetAxis("Horizontal");
    moveSide = Input.GetAxis("Vertical");

    // Player Jump
    if (Input.GetKeyDown(jumpKey) && Physics.Raycast(
            transform.position,
            Vector3.down,
            DistanceToTheGround + 0.1f))
    {
        rb.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse);
    }

    // Braking
    if (Input.GetKey(brakeKey))
    {
        rb.angularDrag = brakeForce;
    }
    else
    {
        rb.angularDrag = 0.01f;
    }
}

void FixedUpdate()
{
    // Player Movement
    Vector3 movement = cam.transform.right * moveFwrd +
                       cam.transform.forward * moveSide;

    movement = movement.normalized;

    rb.AddForce(movement * speed);
}

}

标签: c#unity3d

解决方案


最有可能的答案是摩擦。根据玩家刚体碰撞器使用的物理材质和地板使用的物理材质,刚体的行为会有所不同:

Unity 文档中物理材料检查器对话框的屏幕截图

静摩擦描述了两个物体都没有移动时(即玩家开始移动之前)的摩擦,动态/动能/滑动摩擦描述了玩家沿着/在地板上移动时的摩擦。它还将确定刚体是否在地板上滑动或滚动,您可以尝试使用不同的物理材料来查看效果。

按下跳跃按钮后您会看到在半空中向前移动更快的原因是刚体在空中时不再受到固体材料之间的“接触摩擦”的影响,因此在施加相同的向前力的情况下它会移动得更快。- 但是,仍然存在摩擦:空气阻力;可以由Rigidbody.drag和控制Rigidbody.angularDrag

如果你想摆脱这种模拟行为,你可以做各种事情:使用不同的物理材料Rigidbody.dragRigidbody.mass值,或者尝试使用不同的ForceModeForceMode.VelocityChange,如Rigidbody.AddForce(). 或者根本不使用物理引擎和刚体进行运动(仍然可以使用碰撞器和射线投射)。

旁注:

FixedUpdate()定期调用,是推荐使用与物理相关的脚本的地方。实际上,它的调用频率与更新内部物理引擎的频率相同,如此处所述。每次通话之间的持续时间是恒定的:Time.fixedDeltaTime.

Update()另一方面,以可变速率调用,并且具有可变的持续时间Time.deltaTime,这导致不同的帧速率(FPS)。此方法可用于游戏的视觉渲染或状态处理,如果可能,不应用于更新与物理相关的内容。

在上面的脚本中,您Rigidbody.AddForce()在方法Update()FixedUpdate(). 在后一种情况下使用默认参数ForceMode.Force,在另一种情况下使用ForceMode.Impulse. 在这两种情况下,您都没有考虑帧时间,这在脉冲的情况下很好,应用一次(在按下一个键之后)。在另一种情况下,方向向量被归一化,所以这也不是问题,因为该方法以固定速率调用......但它可以写得更清楚一点。


推荐阅读