达到特定速度后如何停止拖动

时间:2017-06-19 13:41:20

标签: unity3d 2d drag rigid-bodies

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

问题是拖拽似乎是直接设置为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;
    }
}

谢谢 Crouz

1 个答案:

答案 0 :(得分:2)

正如@Maakep所说,问题来自于你将 Rigidbody 速度设置为0并且之后检查此速度是否为<= 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;
    }
}

请记住,如果你的 Rigidbody 配置(质量,阻力和力)应用不同的速度值,这个解决方案远非完美无缺:因此,你赢了能够完全控制拖动何时达到0(这可能完全是故意的,取决于您的项目!):)

您可以查看http://flask.pocoo.org/docs/0.12/api/#flask.Flask.teardown_request中的执行顺序图以获取更多信息:您可以在 Update()之前看到内部物理更新当您致电rb.AddForce(...)时,它实际上仅在下一次内部物理更新期间应用。)

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

希望这有帮助,