插值对象碰撞卡住

Interpolate object collision stuck

我正在 Unity 2D 中进行非常基本的测试。我遇到的问题是,当我的精灵与地面碰撞时,它会不断地检查事件,几乎太频繁了,所以精灵一直处于不确定状态。它没有机会离开地面,因为当它执行检查时告诉它转身导致它快速上下移动。 如下片段所示:

https://m.youtube.com/watch?v=gPmmLjGe9iQ

我想要的是当接触时精灵需要改变它的 Y 轴方向。请在下面查看我的代码。

void Update () {
    hitWall = Physics2D.OverlapCircle(wallCheckUp.position, wallCheckRadius, whatIsWall);
    if (hitWall)
    {
        moveUp = !moveUp;
    }

    if (moveUp)
    {
        transform.localScale = new Vector3(-1f, 1f, 1f);
        GetComponent<Rigidbody2D>().velocity = new Vector2(speed, GetComponent<Rigidbody2D>().velocity.x);
    }
    else
    {
        transform.localScale = new Vector3(1f, 1f, 1f);
        GetComponent<Rigidbody2D>().velocity = new Vector2(-speed, GetComponent<Rigidbody2D>().velocity.x);
    }
}

如果需要更多信息,请告诉我。

编辑

为了让我更清楚,请查看我的精灵设置。

OverlapCircle 检查是否有任何重叠,因此只要它与对象之间存在重叠,它就会为真,因此 运行 你的每一帧的 if 语句都为真。尝试使用 OnCollisonEnter2D 或 OnTriggerEnter2D 方法(只需替换方法名称):

void OnCollisionEnter2D(Collision2D coll)
{
    moveUp = !moveUp;
    if (moveUp)
    {
        transform.localScale = new Vector3(-1f, 1f, 1f);
        GetComponent<Rigidbody2D>().velocity = new Vector2(speed,  GetComponent<Rigidbody2D>().velocity.y);
    }
    else
    {
        transform.localScale = new Vector3(1f, 1f, 1f);
        GetComponent<Rigidbody2D>().velocity = new Vector2(-speed, GetComponent<Rigidbody2D>().velocity.y);
    }
}

还要确保每个对象在检查器中都有一个 Collider2D。

还有一件事。初始化 Vector2 时,参数的顺序是 x,y。我注意到在您的代码中,您在 y(垂直)组件的参数中使用了 GetComponent().velocity.x(水平)。如果您的精灵上下移动,那么这可能是您出错的原因,因为它的 y 分量没有改变(除非您有一些其他代码可以改变 x 分量)。

所以你想改变

new vector2(speed[-speed], GetComponent<Rigidbody2d>().velocity.x)

new vector2(GetComponent<Rigidbody2d>().velocity.x, speed[-speed])

希望对您有所帮助。