为什么不调用OnCollisionExit
?我同时使用OnCollisionEnter
和OnCollisionExit
但不幸的是只调用了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;
}