Unity Physics2D.IgnoreCollision无法正常运行

时间:2018-10-05 02:36:54

标签: c# unity3d collision

我正在尝试使两个对象相互忽略。我尝试实现Physics2D.IgnoreCollision代码,但就目前而言,第一个对象从天上掉下来,或者A)直接撞击下面的对象,停留在那里一秒钟,然后继续向下移动屏幕,或者B)如果它从侧面撞到下面的物体,只会扫视一下下面的物体。我希望两者完全相互忽略。

这是我的代码:

void OnCollisionEnter2D(Collision2D collision) {
    if (collision.gameObject.tag == "obj") {
        Physics2D.IgnoreCollision(collision.gameObject.GetComponent<Collider2D>(), gameObject.GetComponent<Collider2D>());
    }
}

1 个答案:

答案 0 :(得分:3)

(通常)更好的解决方案是使用图层来管理项目类别之间的冲突。您可以将标记obj的对象分配给特定的图层,并将帖子中的对象分配给另一层,然后进入Unity Physics Manager禁用这些层之间的碰撞。 Unity Docs中提供了进一步的指导。

但是如果您必须使用标签,还是有解决方案的。

如果您是在碰撞事件内调用Physics2D.IgnoreCollision,那么在碰撞事件影响对象的速度等之后,您只需忽略它们的碰撞。因此,基本上您称呼为时已晚。

获得所需行为的更好的替代方法是在创建两个对象之后运行的方法中调用它。那里的挑战是,您需要一种方法来引用要忽略的其他游戏对象。

一种解决方案是将调用放入其OnEnable()方法的对象中,然后使用FindGameObjectsWithTag查找要忽略的其他对象:

public class OneObject : MonoBehaviour {

    void OnEnable() {
        GameObject[] otherObjects = GameObject.FindGameObjectsWithTag("obj");

        foreach (GameObject obj in otherObjects) {
            Physics2D.IgnoreCollision(obj.GetComponent<Collider2D>(), GetComponent<Collider2D>()); 
        }

        // rest of OnEnable
    }
   // rest of class ...
}

如果将其放在两种类型的对象的OnEnable中(当然还有另一个对象的标签),它就可以满足您的需求。