【问题标题】:Collision in dragable objects not working可拖动对象中的碰撞不起作用
【发布时间】:2019-05-21 10:56:39
【问题描述】:

我的游戏能够点击和生成对象并用鼠标移动它们。然而,当块与墙壁碰撞时,我希望它们被摧毁。我已经以与其他对象相同的方式设置了碰撞,但它似乎没有注册。下面是移动和碰撞的代码。

  void OnMouseDrag()
{
    if (prepPhase == true)
    {
        Vector2 mousePosition = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
        Vector2 objectPosition = Camera.main.ScreenToWorldPoint(mousePosition);

        transform.position = objectPosition;
    }
}


void OnCollisionEnter2D(Collision2D col)
{
    if (col.gameObject.CompareTag("Wall"))
    {
        Destroy(col.gameObject);
        Debug.Log("Collision");
    }
}

每次生成一个新块时,它都会创建前一个对象的克隆。每个克隆都附有这个脚本。我还测试了将碰撞脚本附加到墙上而不是块上,碰撞检测到“块”标签。但它仍然不会破坏对象。

【问题讨论】:

    标签: unity3d collision


    【解决方案1】:

    问题在于您实际上是通过设置位置来传送您的对象。这会阻止 onCollisionEnter2D 事件触发。

    您可以通过在 if 之前添加一条日志语句来确认这一点

    void OnCollisionEnter2D(Collision2D col)
    {
        Debug.Log("OnCollisionEnter2d Fired");
        if (col.gameObject.CompareTag("Wall"))
        {
            Destroy(col.gameObject);
            Debug.Log("Collision");
        }
    }
    

    改为 OnCollisionStay2D 应该可以解决问题。

    void OnCollisionStay2D(Collision2D col)
    {
        if (col.gameObject.CompareTag("Wall"))
        {
            Destroy(col.gameObject);
            Debug.Log("Collision");
        }
    }
    

    【讨论】:

    • 这行得通!但是由于某种原因仍然不是墙壁,但它与其他物体有关,但我可以解决这个问题;谢谢!
    • 这可能与墙壁上对撞机的大小有关。此外,您可能需要在某些情况下使用 RayCasting 来检测碰撞。
    【解决方案2】:

    您的Destroy 没有引用碰撞中的确切游戏对象。相反,请尝试:

    Destroy(col.gameObject)
    

    阅读文档:https://docs.unity3d.com/ScriptReference/Collision2D.html

    【讨论】:

    • 我已经改成这个了,还是没有结果。我也将其设置为将“冲突”写入日志,但这不会出现。 'Wall' 标签也适用于其他任何地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多