【问题标题】:How to Ignore Collision between Objects如何忽略对象之间的碰撞
【发布时间】:2017-04-13 15:19:36
【问题描述】:

1.我编写了一个脚本,在 2D 游戏中使用 ontriggerenter 来查找炮弹击中另一艘船的时间。

private void OnTriggerEnter(Collider other)
{


    if (other.tag != "cannonBallWASD" )
    {
        return;
    }

    Destroy(other.gameObject);
    Destroy(gameObject);
    Debug.Log(other);
}

2. 使用 WASD(ShipWASD)控制的船向使用箭头键(ShipArrows)控制的第二艘船发射炮弹(cannonballWASD)。此代码位于 ShipArrows 附加的脚本中。

3.我有一段单独的代码,它使用一个没有网格渲染器的立方体(边界),它破坏了任何离开边界的炮弹,所以看起来它们正在落入大海。这是一款 2 人游戏。

4.问题就在这里——边界随船四处移动,它是 ShipArrows 的孩子。当我发射大炮时,炮弹击中边界而不是船只对撞机。当我移除边界时,它应该会撞到船,但边界是我想要的。

5.边界和船都有并且需要在它们上面触发碰撞器。有什么办法可以忽略此脚本中的边界,但不忽略以下脚本中的边界。

private void OnTriggerExit(Collider other)
{
    if(other.tag != "cannonBallWASD" && other.tag != "cannonBallArrows")
    {
        return;
    }
    Destroy(other.gameObject);
}

此脚本通过在离开 ShipArrows 边界时将其摧毁,使 ShipArrows cannonBalls 看起来像是坠入海中。 (两艘船都这样做。)

【问题讨论】:

  • 所以当你击中飞船时,触发边界的触发器会被调用?
  • 为什么你的目标船有边界?如果你想击沉炮弹,一旦它们离开射击船的边界就应该去海里。射击船边界显然会忽略其他船的炮弹,反之亦然
  • 而不是做if not a tagif a tag 并将你想要的代码放在 if 中并忽略其余部分。 IE if(other.tag == "theTagToDoCodeOn"){ the code } 在我看来,事情正在从你的 if return 溜过去

标签: c# unity3d


【解决方案1】:

要忽略冲突,请使用Physics.IgnoreCollision

还有Physics.IgnoreLayerCollision 用于忽略层上的冲突。

只需将所有要忽略的对象放在一个图层中,然后调用该函数来忽略它们上面的图层。

忽略 Collison 3D

Physics.IgnoreCollision(yourFirstCollider, yourSecondCollider, true)

Physics.IgnoreLayerCollision(yourFirstLayer, yourOtherLayer, true);

重置/识别 Collison 2D

Physics2D.IgnoreCollision(yourFirstCollider, yourSecondCollider, false);

Physics2D.IgnoreLayerCollision(yourFirstLayer, yourOtherLayer, false)

两个层不必相同。您可以忽略来自不同层的对象的碰撞。这也可以通过编辑器来完成,无需代码,方法是分配每个 GameObject 层并转到 Edit --> Project Settings --> Physics - -> 或 Edit --> Project Settings --> Physics 2D 然后配置哪些层应该从那里相互碰撞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多