使用physics2d检测2个碰撞器的碰撞

时间:2014-02-20 03:53:35

标签: c# unity3d

我有一个圆形对撞机2d的物体,以及一个带有对撞机2d的物体。我如何检测circlecollider何时击中盒子对撞机的顶部边缘。假设没有任何对象有任何旋转。我想在代码C#

中这样做

1 个答案:

答案 0 :(得分:3)

当某些内容与包含此脚本的对象发生冲突时,

OnCollisionEnter会触发,如下所示:

void OnCollisionEnter(Collider collider)
{
    foreach(CollisionPoint contact in collider.contacts)
    {
        //Do something
    }
}

以上内容将为您提供碰撞的接触点列表,您可以通过该列表确定碰撞发生的位置。如果您只需要检测指定位置的碰撞,则可以使用另一种方法,您可以在立方体中放置一个不可见的子对象,并在您想要的位置放置一个碰撞器。

修改

既然你提到了光线投射,我可以想到有两种方法可以实现这些。第一种方法是从立方体向上发射它,但这只有1点射线发射的问题,这意味着可能会错过一些碰撞(取决于立方体和球体的大小)。

弹出的第二种方法是平行于立方体发射光线。这可能听起来有点不正统,我没有测试过,但从理论上说它应该可行。把它贴在你的立方体中:

void Update
{
    Vector3 start = this.transform.position;
    Vector3 end= this.transform.position;

    //This attempts to place the start & end point just above the cube
    //This of course assumes the cube isn't rolling around. If that's the case
    //then these calculations get quite a bit more complicated
    //Additionally the 0.01 might need adjusting if it's too high up off the cube
    start.y += this.renderer.bounds.y/2 + 0.01f;
    end.y += this.renderer.bounds.y/2 + 0.01f;

    start.x -= this.renderer.bounds.x/2;
    end.x += this.renderer.bounds.x/2;

    Ray ray = new Ray(start, end);
    RaycastHit hit;

    if(Physics.Raycast(ray, out hit, start.x-end.x) && hit.name == "mySphere")
    {
        //Theoretically, the sphere hit the top of the box!
    }
}