C# OnCollisionExit没有被调用
为什么没有调用C# OnCollisionExit没有被调用,c#,unity3d,C#,Unity3d,为什么没有调用OnCollisionExit?我同时使用了OnCollisionCenter和OnCollisionExit,但不幸的是,只调用了OnCollisionCenter public bool HandleCollided = false; public void OnCollisionEnter(Collision col) { if(col.gameObject.name == "RightHandAnchor") { HandleCollide
OnCollisionExit
?我同时使用了OnCollisionCenter
和OnCollisionExit
,但不幸的是,只调用了OnCollisionCenter
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;
}
}
你需要一个非运动学刚体连接到你的对象才能获得OnCollisionExit的事件,所以你说“有两个对象相互碰撞。一个连接了球体碰撞器,另一个连接了长方体碰撞器。其中一个对象也连接了刚体。”代码是哪一个?是的,这很重要!只有1个对象将跟踪退出,这意味着如果退出是非运动学的,它将不起作用。无法根据给定的代码片段判断代码不起作用的原因-此代码取决于编辑器中每个
游戏对象的检查器窗口的配置
此脚本附加到的GameObject
和碰撞的GameObject
都必须有一个Collider
组件附加到每个组件(例如,一个BoxCollider
组件或一个SphereCollider
组件)。两个碰撞器
必须禁用其isTrigger
复选框。此脚本附加到的游戏对象
也必须附加刚体
组件
为了调试这种情况,请在函数中添加debug.Log()
语句。这通常是很好的实践,可能是调用了函数,但条件语句不是真的
以下是一些关于可能出现问题的其他想法:
- 您可能正在更改代码中其他地方碰撞的
游戏对象的名称
- 您可能正在销毁
游戏对象
- 这可能是因为两个函数都没有被调用,并且代码中的其他地方也发生了更改
- 可能是参数“
col
”不是您所期望的
public void OnCollisionEnter(冲突列)
{
Log(“碰撞输入!”);
Log(col.gameObject.name);
}
公共空间冲突退出(冲突列)
{
Log(“冲突退出!”);
Log(col.gameObject.name);
}
不幸的是,使用OnCollisionExit不起作用,所以我使用了OnTiggerEnter和OnTiggerExit。我为两个对象都激活了“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;
}
}
尝试使用OnCollisionCenter()
和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;
}
void OnCollisionEnter(碰撞)
{
if((collision.gameObject.GetComponent().attributes&doorType)!=0)
{
this.GetComponent().isTrigger=true;
}
}
私有无效OnTriggerExit(碰撞器其他)
{
this.GetComponent().isTrigger=false;
}
如果您希望我们可以帮助您,您必须复制调用函数的代码。默认情况下,函数被调用,因为我已将box collider添加到对象中,并将此脚本添加到同一对象中。呵呵,我还没有看到统一旗帜。你是否改变了刚体中的某些东西或场景中的其他任何东西(例如禁用碰撞器、对象)在OnCollisionCenter
之后?不,我不会更改或禁用场景或脚本中的任何内容。这并不能真正回答问题,因为如果没有它,也不会调用OnCollisionCenter
。感谢您的详细回答。我试过做每件事,结果还是一样。(a) 我有两个游戏对象。第一个具有附着在其上的刚体,禁用了重力和运动学组件。它有一个球体碰撞器组件,已禁用isTrigger。(b) 第二个游戏对象连接了一个盒子碰撞器,禁用了isTrigger。(c) 上面的脚本附加到第二个游戏对象。我收到的消息是“碰撞输入!”但不是“碰撞退出!”这很奇怪,谢谢您尝试脚本。在Unity中的某个地方可能有一个我不知道的物理设置,但如果您在项目设置中更改了任何内容,您就会知道。如果仍然存在问题,请尝试在新场景或新项目中设置并运行相同的脚本,如果仍然存在问题,我会尝试重新安装Unity。你的安装不太可能出现任何问题,但至少重新设置对象可以保证这不是问题所在。第二个只连接了box collider的游戏对象有代码。