【问题标题】:Unity : How to handle compound colliders 2D physicsUnity:如何处理复合对撞机 2D 物理
【发布时间】:2016-01-12 18:20:00
【问题描述】:

我正在制作一个小游戏,其中的基本游戏机制是在关卡中拖动东西。我的 Player G.O. 是在关卡周围拖动其他对象的人。这个G.O.(玩家GO)有一个rigidBody2D组件,为了拖动其他物体,我把被拖动的物体变成了player的一个child,这样我只通过rigidBody组件移动玩家,被拖动的物体沿着玩家对象。

问题在于,当本应通过接触杀死玩家的东西接触到被拖动的物体时,即使玩家一开始并没有接触到危险物体,玩家的死亡仍然会触发。这显然不是预期的结果,如果想要杀死玩家的东西接触到被拖动的物体而不是玩家,则不应杀死玩家。我该如何解决这个问题?

编辑:杀死我的意思是摧毁玩家GO。

【问题讨论】:

    标签: unity3d collision-detection rigid-bodies


    【解决方案1】:

    如果你删除你的父游戏对象,它的所有子游戏对象也会随之删除。为了不删除您拖动的对象,您应该在删除父游戏对象之前将它们删除到其他地方。你可以这样做: YourChildGameObject.transform.SetParent(OtherParentGameObject, false);

    另外,this link could help you

    【讨论】:

    • 对不起,问题是每当本应杀死玩家的东西与被拖动的物体碰撞时,玩家就会被杀死,我正在努力防止这种情况发生
    • 杀人是什么意思?从层次结构中完全删除它?有点难以理解您的要求。
    • 他在谈论输掉比赛!
    • 是的,当危险物体接触到玩家时,玩家 G.O. 会从场景中删除。
    【解决方案2】:

    这是碰撞问题。 为玩家和敌人设置不同的层。 转到编辑 -> 项目设置 -> 物理。在底部,您会看到碰撞列表。您可以检查哪些图层与那里的哪些图层发生碰撞。将“敌人”层设置为仅与“玩家”层发生碰撞。

    另一种方法是检查与 OnCollisionEnter 或 OnTriggerEnter 碰撞的敌人是什么(取决于您的操作方式)。你可以这样做:

    //You can change this to OnTriggerEnter and "Collision" with "Collider"
    void OnCollisionEnter(Collision col) 
    {
        if (col.gameObject.name == "player")
        {
          //Kill the player
        }
    }
    

    祝你好运!

    【讨论】:

    • 其实我就是这么做的void OnCollisionEnter2D(Collision2D other) { if(other.gameObject.tag == "Player") { other.gameObject.transform.DetachChildren(); Destroy(other.gameObject); } } 不幸的是,我不能限制敌人层只与玩家层发生碰撞,因为敌人也需要与其他层发生碰撞。
    • 目前,我的“杀戮”只是一个简单的 Destroy(playerObject) 。问题是,当一些危险对象(具有我上面详述的脚本的对象)与拖动的对象接触时,会触发“杀戮”,玩家 G.O. 被摧毁。
    • 很奇怪。尝试添加一个 Debug.Log 来打印被击中的对象的标签。此外,请检查 危险物品 在更改其父项时不要更改其标签。我们将解决这个问题。
    • 抱歉这么晚才回复。出于某种奇怪的原因,Debug.Log 显示敌人正在与盒子发生碰撞,即使根本没有碰撞。当 Enemy 与玩家拖动的框碰撞时,Debug.Log 显示已检测到与玩家发生碰撞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多