未调用OnCollisionExit

时间:2019-04-25 10:37:47

标签: c# unity3d

为什么没有调用OnCollisionExit?我同时使用OnCollisionEnterOnCollisionExit,但是很不幸,只有OnCollisionEnter被调用。

public bool HandleCollided = false;

public void OnCollisionEnter(Collision col)
{
    if(col.gameObject.name == "RightHandAnchor")
    {
        HandleCollided = true;
    }
}

public void OnCollisionExit(Collision col)
{
    if(col.gameObject.name == "RightHandAnchor")
    {
        HandleCollided = false;
    }
}

5 个答案:

答案 0 :(得分:3)

基于给定的代码片段,无法判断为什么代码无法正常工作-该代码取决于编辑器中每个GameObjects'检查器窗口的配置。

此脚本所附加的GameObject和冲突的GameObject都必须具有一个Collider组件(例如,一个BoxCollider组件或SphereCollider组件)。两个Colliders都必须禁用其isTrigger复选框。该脚本附加到的GameObject还必须附加一个Rigidbody组件。

为了调试这种情况,请在函数中添加Debug.Log()语句。通常,这是一种好习惯,可能是正在调用该函数,但条件语句不正确。

关于可能出了什么问题,还有一些其他想法:

  • 您可能正在代码中其他地方更改发生冲突的GameObject的名称。
  • 您可能正在破坏GameObject
  • 可能没有调用任何函数,而HandleCollided也未在代码中的其他地方被更改。
  • 可能col参数不是您所期望的。
public void OnCollisionEnter(Collision col)
{
    Debug.Log("Collision Enter!");
    Debug.Log(col.gameObject.name);
}
public void OnCollisionExit(Collision col)
{
    Debug.Log("Collision Exit!");
    Debug.Log(col.gameObject.name);
}

答案 1 :(得分:1)

因此,您说:“有两个物体相互碰撞。一个物体附着有球体碰撞器,另一个具有盒子碰撞器。其中一个物体也具有刚体。”代码在哪一个上?是的,这很重要!只有一个对象会跟踪出口,这意味着如果不是运动学对象,将无法正常工作。

答案 2 :(得分:1)

不幸的是,使用OnCollisionExit无效,因此我改用了OnTriggerEnter和OnTriggerExit。我为两个对象都激活了“ isTrigger”。

fk_KOMANDAid_KOMANDA

答案 3 :(得分:0)

您需要将非运动刚体附加到对象上才能获取OnCollisionExit事件

答案 4 :(得分:0)

尝试使用OnCollisionEnter()OnTriggerExit()

示例:

void OnCollisionEnter(Collision collision)
    {
      if((collision.gameObject.GetComponent<AttributeManager>().attributes & doorType) != 0)
        {
            this.GetComponent<BoxCollider>().isTrigger = true;
        }
    }


private void OnTriggerExit(Collider other)
{
    this.GetComponent<BoxCollider>().isTrigger = false;
}