插值对象碰撞卡住

时间:2017-02-08 13:25:31

标签: c# collision-detection interpolation unity2d

我正在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);
    }
}

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

修改

为了使我更清楚,请参阅我的精灵设置。

enter image description here

1 个答案:

答案 0 :(得分:1)

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])

希望这会有所帮助。