我的场景中有两个对象,一个对象只有一个BoxCollider2D
( Column类),第二个对象还有一个Rigibody2D
及其自己的{ {1}}(播放器类)。
我向第一个对象添加了一个脚本,使其具有BoxCollider2D
。我看到当我的第二个对象与之碰撞时,它被触发,当它尝试进入时,它又使第二个对象反弹。
我确实看到我的OnCollisionEnter2D
方法被调用。但是,如果我将第二个对象再次移动到第一个对象,它将再次弹回,但是我看不到我的OnCollisionEnter2D
方法被第二次调用。
这是预期的行为吗?如果是这样,那么这两个对象之间发生碰撞时,将调用什么方法?
注意:我看到OnCollisionEnter2D
被叫了几次,然后停了下来。我认为这是将第二个物体弹起的时候。我还看到OnCollisionStay2D
从未接到过电话。我放大了编辑器,清楚地看到BoxCollider2D的绿线在我的对象之间没有重叠,因此当它反弹回来时它应该已经退出了碰撞。
OnCollisionExit2D
和
public class Column : MonoBehaviour
{
private BoxCollider2D columnColl;
// Start is called before the first frame update
void Start()
{
columnColl = GetComponent<BoxCollider2D>();
}
// Update is called once per frame
void Update()
{
}
private void OnCollisionExit2D(Collision2D collision)
{
Debug.Log("Collision Exit");
}
void OnCollisionStay2D(Collision2D collision)
{
//Debug.Log("Collision Stayed");
}
void OnCollisionEnter2D(Collision2D collision)
{
Debug.Log("Collision Happened");
}
}
答案 0 :(得分:0)
您不应该“手动”更改rbody.position
。
使用Rigidbody.MovePosition移动Rigidbody,遵守Rigidbody的插值设置。
如果在刚体上启用了刚体插值,则调用
Rigidbody.MovePosition
会导致所渲染的任何中间帧中两个位置之间的平滑过渡。如果要在每个FixedUpdate
中连续移动刚体,则应使用此方法。如果要将刚体从一个位置传送到另一个位置,而不会渲染中间位置,则设置
Rigidbody.position
。
您还应该在FixedUpdate
(而非物理Update
)中使用它,而不是void FixedUpdate()
{
if (Input.GetKeyDown("d"))
{
rbody.MovePosition(rbody.position + new Vector2(xMoveSpeed, 0);
}
}
kinematic
还要确保至少一个对象不是OnCollisionEnter的不是 {{1}}:
只有在其中一个对撞机还附有非运动学刚体的情况下,会发送碰撞事件。