【问题标题】:Unity Physics2D.IgnoreCollision not functioning properlyUnity Physics2D.IgnoreCollision 无法正常运行
【发布时间】:2019-03-10 11:45:00
【问题描述】:

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

这是我的代码:

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

【问题讨论】:

    标签: c# unity3d collision


    【解决方案1】:

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

    【讨论】:

    • 这很棒!我不得不将它从“开始”切换到“更新”,但在那之后,一切都很顺利。
    • ignoreCollision imo 的最佳位置是在 OnEnable 中。那是因为当对象被禁用时它们会“丢失”。顺便说一句,如果您要将其保留在 Update 中,请检查探查器,看看这是否对性能的影响超过了您的承受能力。
    • @Nikaas 很好的建议。我已经编辑了我的答案以提出建议。
    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 2022-07-05
    • 2021-04-22
    • 2015-12-08
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多