3

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

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

编辑

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

在此处输入图像描述

4

1 回答 1

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

希望这有帮助。

于 2017-02-08T14:14:26.607 回答