我正在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);
}
}
如果需要更多信息,请告知我们。
修改
为了使我更清楚,请参阅我的精灵设置。
答案 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])
希望这会有所帮助。