OnCollisionEnter2D仅被调用一次

时间:2019-04-02 02:58:50

标签: unity3d unityscript

我的场景中有两个对象,一个对象只有一个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");
    }
}    

1 个答案:

答案 0 :(得分:0)

您不应该“手动”更改rbody.position

宁可使用Rigidbody.MovePosition

  

使用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}}:

  

只有在其中一个对撞机还附有非运动学刚体的情况下,会发送碰撞事件。