Collider.isTouching用于3D对撞机

时间:2018-11-23 21:15:09

标签: c# unity3d 3d

if (colliderBox.isTouching (col) && col.CompareTag("barrier")) {
        score++;
        this.GetComponent<Renderer> ().material.color = col.GetComponent<Renderer> ().material.color;
    }

    if (spriteBox.IsTouching(col) && col.CompareTag("barrier") ) {
        Debug.Log (col);
        Debug.Log (colliderBox);
        SceneManager.LoadScene (mainMenu);
    }

当前,在我的代码中,我正在使用onTriggerEnter来检测与名为“ barrier”的对象的碰撞,但是我不得不用3D对象替换2d spriteBox和2d colliderBox,现在isTouching不再是3D对撞机。我找不到简单的替代品。我可以用什么代替它们?

2 个答案:

答案 0 :(得分:1)

没有用于3D碰撞的isTouching函数的等效版本,但您可以自己滚动。当OnTriggerEnter时,存储集合中涉及的两个对撞机。调用OnTriggerExit时,请检查所涉及的两个对撞机,如果已经退出集合,请从集合中删除它们。这就是我在this帖子中使用CollisionDetection脚本所做的事情。

CollisionDetection脚本附加到将要碰撞的对象上。

要检查Collider是否在触摸另一个Collider,请更改:

if (colliderBox.isTouching (col) && col.CompareTag("barrier")) { }

收件人:

if (CollisionDetection.IsTouching (colliderBox.gameObject, col.gameObject) && col.CompareTag("barrier")) {  }

您还可以为CollisionDetection类添加ExtensionMethod:

public static class ExtensionMethod
{
    public static bool IsTouching(this Collider collider, Collider otherCollider)
    {
        return CollisionDetection.IsTouching(collider.gameObject, otherCollider.gameObject);
    }

    public static bool IsTouching(this GameObject collider, GameObject otherCollider)
    {
        return CollisionDetection.IsTouching(collider, otherCollider);
    }
}

现在,假设if (colliderBox.isTouching (col) && col.CompareTag("barrier"))colliderBoxCollider类型,您的GameObject代码应该可以正常工作。

答案 1 :(得分:0)

在与 OnTriggerEnter 方法中的问题长时间斗争之后,我找到了另一种方法

<块引用>

collider1.bounds.Intersects(collider2.bounds)

虽然有一种特殊情况,这种方法不起作用,如果 collider2 是一个像盒子一样的空心网格对撞机,并且 collider1 在里面,即使它们没有接触它,它们的交点也会返回 true,所以我建议使用 simple像盒子和球体对撞机这样的对撞机