【问题标题】:How to stop drag after reaching a specific speed达到特定速度后如何停止阻力
【发布时间】:2017-11-21 18:25:45
【问题描述】:

我有以下代码,它以随机方向向刚体2d 添加力,并尝试在达到特定速度时将线性拖动设置为 0,基本上让游戏对象慢慢飘走。

问题是drag好像马上就设为0了,不明白为什么,所以无法解决问题

void Update () {
    if (Input.GetKeyDown ("space")) {
        rb.velocity = Vector3.zero;
        Vector3 dir = Random.onUnitSphere;
        rb.AddForce (dir * 10, ForceMode2D.Impulse);
    }

    if (rb.velocity.magnitude <= 1) {
        rb.drag = 0;
    }
}

谢谢 克鲁兹

【问题讨论】:

  • 您在击中空间时将速度设置为 0,这会将幅度设置为 0。您施加的力可能没有将 velocity.magnitude 设置为&lt;= 1,这会为您提供 rb。 drag = 0。rb.drag 设置一次后,您永远不会更改它。
  • 谢谢@Maakep。我假设向刚体添加力将确保其速度在新方向上设置为新值,并且幅度值也会随之而来。
  • 我没有测试过,但我假设是这样,物理不是在 Update() 中计算的。更新每帧都会运行,所以我猜它在某些帧上没有移动到超过 1 的幅度,这会将所有未来的阻力设置为 0。您可以通过设置 Debug.Log(rb.velocity.magnitude); 轻松检查这一点。在更新方法中。我很想听听结果
  • 解决这个问题的一种方法可能就是这样做:else if (rb.drag != yourMagnitude) { rb.drag = yourMagnitude; } on that if。所以它在低速时漂浮并在高速时减少。

标签: unity3d 2d drag rigid-bodies


【解决方案1】:

正如@Maakep 所说,问题出在您将刚体 速度设置为0 并随后检查该速度是否为&lt;= 1(仅在稍后应用力)。

要解决您的问题,您可以这样做:

public bool applyNextFrame = false;

protected override void Update()
{
    if(applyNextFrame && rb.velocity.magnitude <= 1)
    {
        rb.drag = 0;
        applyNextFrame = false;
    }

    if(Input.GetKeyDown(KeyCode.Space))
    {
        rb.velocity = Vector3.zero;
        Vector3 dir = Random.onUnitSphere;
        rb.AddForce(dir * 10, ForceMode2D.Impulse);
        applyNextFrame = true;
    }
}

请记住,此解决方案远非完美,因为如果您的 刚体 配置(质量、阻力和施加的力)应用不同的速度值,您可能会遇到问题:因此,您将无法完全控制拖动到达0 的时间(这可能完全是故意的,具体取决于您的项目!):)

您可以查看位于 this page 的执行顺序图以获取更多信息:您可以看到 内部物理更新 发生在 Update() 之前(当您调用 rb.AddForce(...) 它实际上只在下一次内部物理更新期间应用。

另请注意,我将Input.GetKeyDown("space") 更改为Input.GetKeyDown(KeyCode.Space):如果您输入错误space,这样可以避免拼写错误。

希望对你有帮助,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多