首页 > 解决方案 > Unity Physics2D.IgnoreCollision 无法正常运行

问题描述

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

这是我的代码:

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

标签: c#unity3dcollision

解决方案


一个(通常)更好的解决方案是使用层来管理项目类别之间的冲突。您可以将obj-tagged 对象分配给特定层,并将帖子中的对象分配给另一个层,然后进入 Unity 物理管理器以禁用这些层之间的碰撞。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两种类型的对象中(当然还有另一个对象的标签),它应该满足你的需要。


推荐阅读