首页 > 解决方案 > OnCollisionEnter2D 只被调用一次

问题描述

我的场景中有两个对象,一个只有一个BoxCollider2DColumn 类),第二个对象有一个Rigibody2D以及它自己的BoxCollider2DPlayer 类)。

我在第一个对象中添加了一个脚本以具有OnCollisionEnter2D. 我看到当我的第二个对象与它碰撞时它会被触发,并且当它试图进入时它会将我的第二个对象弹回。

我确实看到我的OnCollisionEnter2D方法被调用了。但是,如果我再次将我的第二个对象移动到我的第一个对象上,它会再次反弹回来,但是我没有看到我的OnCollisionEnter2D方法第二次被调用。

这是预期的行为吗?如果是这样,每次这两个对象之间发生碰撞时会调用什么方法?

注意:我看到OnCollisionStay2D被叫了几次,然后就停止了。我认为这是它弹起我的第二个物体的时候。我也看到OnCollisionExit2D从未被调用过。我放大编辑器,清楚地看到 BoxCollider2D 的绿线在我的对象之间没有重叠,所以当它反弹回来时应该已经退出了碰撞。

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");
    }
}    

public class Player : MonoBehaviour
{
    public float xMoveSpeed = 1f;
    private Rigidbody2D rbody;

    // Start is called before the first frame update
    void Start()
    {
        rbody = GetComponent<Rigidbody2D>();    
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown("d"))
        {
            rbody.position = rbody.position + new Vector2(xMoveSpeed, 0);
        }
    }
}

标签: c#unity3d

解决方案


你不应该“手动”改变rbody.position

而是使用Rigidbody.MovePosition

使用 Rigidbody.MovePosition 移动刚体,符合刚体的插值设置。

如果在刚体上启用刚体插值,则调用Rigidbody.MovePosition会导致渲染的任何中间帧中两个位置之间的平滑过渡。如果您想在每个FixedUpdate.

Rigidbody.position如果您想将刚体从一个位置传送到另一个位置,而不渲染中间位置,请改为设置。

你也应该这样做,FixedUpdate其中用于物理而不是Update

void FixedUpdate()
{
    if (Input.GetKeyDown("d"))
    {
        rbody.MovePosition(rbody.position + new Vector2(xMoveSpeed, 0);
    }
}

还要确保至少有一个对象不是 kinematicOnCollisionEnter :

仅当其中一个碰撞器还附加了非运动学刚体时,才会发送碰撞事件。


推荐阅读