我正在 Unity 2D 中进行非常基本的测试。我遇到的问题是,当我的 Sprite 与地面碰撞时,它会不断地检查事件,几乎太频繁了,所以 Sprite 一直处于不确定状态。它没有机会离开地面,因为当它执行检查时告诉它转身导致它快速上下移动。 如下图所示:
https://m.youtube.com/watch?v=gPmmLjGe9iQ
我想要的是当接触发生时 Sprite 需要改变它的 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);
}
}
如果需要更多信息,请告诉我。
编辑
为了让我更清楚,请查看我的 Sprite 设置。
最佳答案
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(水平)。如果您的 Sprite 上下移动,那么这可能是您出错的原因,因为它的 y 分量没有改变(除非您有一些其他代码可以改变 x 分量)。
所以你想改变
new vector2(speed[-speed], GetComponent<Rigidbody2d>().velocity.x)
到
new vector2(GetComponent<Rigidbody2d>().velocity.x, speed[-speed])
希望这对您有所帮助。
关于c# - 插值对象碰撞卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42114402/