如何在没有刚体或光线投射的情况下检测触发/碰撞

时间:2016-06-13 06:35:36

标签: c# unity3d

我有两个Gameobjects A和B,我想检测触发器b / w它们。请记住,由于性能原因,我不想将 Rigidbody 与对手或 Physics.Raycast 一起使用。

我不想使用Raycast,因为它很贵,而且也是Rigidbody因为它不允许区分which Object trigger the Another (like did car hit the motorcycle or motorcylce hit the car).

所以我的简单问题是,有没有第三,第四,第五或第六种方式可用于检测触发而不使用任何 Raycast / Rigidbody / Collider

2 个答案:

答案 0 :(得分:5)

使用Plane struct http://docs.unity3d.com/ScriptReference/Plane.html

为什么?

  1. 性能,比Raycasts

  2. 更快
  3. 准确性,平面交叉点更精确

  4. 什么是飞机?

    Unity中的平面由原点(位置矢量)和法线(垂直于平面的方向矢量)定义。例如,具有原始Vector3.zero和普通Vector3.up

    的平面
    var plane = new Plane(Vector3.up, Vector3.zero); // new Plane(normal, origin)
    

    在X / Z轴上创建一个理论平面,其大小无限并位于原点。确保正常的vecor正常化!

    如何使平面与光线相交?

    使用 Plane.Raycast(ray)方法,输入光线并从交叉点接收距离。然后,将此距离输入光线内的 Ray.GetPoint(距离)方法。像这样:

    // var plane from before
    var distance : float;
    
    plane.Raycast (new Ray(Vector3(0, 10, 0), -Vector3.up), distance);
    var point = Ray.GetPoint(distance);
    Debug.Log(point.ToString());
    

    代码应该打印"(0,10,0)",因为光线从原点上方的Y轴开始以10个单位开始,并且在它撞击飞机之前向下行进10个单位。

    实施例

    以下是使用Plane结构和Ray结构有效计算交点的示例。

    public Plane groundPlane;
    
    void Update() {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Vector3 point = GetIntersectionPoint(groundPlane, ray)
            Debug.Log(point.ToString());
        }
    }
    
    Vector3 GetIntersectionPoint(Plane plane, Ray ray) {
        float rayDistance;
        if (plane.Raycast(ray, out rayDistance))
        {
            return ray.GetPoint(rayDistance);
        }  
    }
    

    注意

    不要被使用的Ray结构所欺骗。 plane.Raycast()使用光线进行矢量线计算和平面,将该线上的距离返回到交点。

答案 1 :(得分:0)

也许像Physics.Overlap这样的东西? https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html