c# - Unity Physics2D.IgnoreCollision 无法正常运行

标签 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>());
    }
}

最佳答案

(通常)更好的解决方案是使用图层来管理项目类别之间的冲突。您可以将标记为 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中(当然还有另一个对象的标签),它应该能满足你的需要。

关于c# - Unity Physics2D.IgnoreCollision 无法正常运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52657626/

相关文章:

c# - 紧急错误cs0542成员名称不能与它们的封闭类型相同

c# - 实时切割网格

Java - 二维数组 map 中的移动和墙壁碰撞

python - pygame中的墙壁碰撞

javascript - vec3.unproject()鼠标碰撞问题

c# - 如何在一条线上做到这一点?

c# - WPF:如何使自定义模式对话框闪烁?

c# - LinqToXML XElement 到 XmlNode

c# - Unity Ads 无法在 Android 设备上运行,Advertisement.IsReady() 返回 false

c# - 动态更改 TPL 数据流 block MaxDegreeOfParallelism