OnCollisionExit is not being called



为什么不调用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;
}
}

根据给定的代码片段,无法判断为什么您的代码不起作用 - 此代码取决于编辑器中每个GameObjects'检查器窗口的配置。

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

为了调试这种情况,请在函数中添加Debug.Log()语句。这通常是很好的做法,可能是正在调用函数,但条件语句不为 true。

以下是一些关于可能出错的其他想法:

  • 您可能正在将冲突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 个物体会跟踪出口,这意味着如果它是非运动学的,它将不起作用。

不幸的是,使用 OnCollisionExit 不起作用,所以我使用了 OnTriggerEnter 和 OnTriggerExit。我为这两个对象激活了"isTrigger"。

public void OnTriggerEnter(Collider col)
{
Debug.Log("entered");
if (col.gameObject.name == "RightHandAnchor")
{
HandleCollided = true;
}
}
public void OnTriggerExit(Collider other)
{
Debug.Log("exit");
if (other.gameObject.name == "RightHandAnchor")
{
print("No longer in contact with " + other.transform.name);
HandleCollided = false;
}
}

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

尝试使用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;
}

最新更新