Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OnCollisionExit没有被调用_C#_Unity3d - Fatal编程技术网

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的游戏对象有代码。