示例#1
0
    private void PreformGraphics(PvrBasePoint pointer, List <Graphic> results)
    {
        Vector2 screenPos = eventCamera.WorldToScreenPoint(pointer.ray.GetPoint(pointer.maxPointDistance));
        var     graphics  = GraphicRegistry.GetGraphicsForCanvas(canvas);

        for (int i = 0; i < graphics.Count; i++)
        {
            Graphic g = graphics[i];
            Debug.Log(g.gameObject.name);
            if (g.depth == -1 || !g.raycastTarget)
            {
                continue;
            }

            if (!RectTransformUtility.RectangleContainsScreenPoint(g.rectTransform, screenPos, eventCamera))
            {
                continue;
            }
            if (g.Raycast(screenPos, eventCamera))
            {
                sortedGraphics.Add(g);
                // Debug.Log(g.gameObject.name);
            }
            sortedGraphics.Sort((g1, g2) => g1.depth.CompareTo(g.depth));
            foreach (var s in sortedGraphics)
            {
                results.Add(s);
            }
            sortedGraphics.Clear();
        }
    }
示例#2
0
    public override void Raycast(PointerEventData eventData, List <RaycastResult> resultAppendList)
    {
        if (canvas == null || eventCamera == null)
        {
            return;
        }
        PvrBasePoint pointer     = PvrLaserPointer.pointer;
        float        hitDistance = float.MinValue;

        if (blockingObjects != BlockingObjects.None)
        {
            float dist = eventCamera.farClipPlane - eventCamera.nearClipPlane;
            if (blockingObjects == BlockingObjects.ThreeD || blockingObjects == BlockingObjects.All)
            {
                RaycastHit hit;
                if (Physics.Raycast(pointer.ray, out hit, dist, blockingMask))
                {
                    hitDistance = hit.distance;
                }
            }
        }
        raycastResults.Clear();
        PreformGraphics(pointer, raycastResults);
        pointer.isHit = false;
        for (int i = 0; i < raycastResults.Count; i++)
        {
            GameObject go    = raycastResults[0].gameObject;
            Plane      plane = new Plane(go.transform.forward, go.transform.position);
            float      enter = 0.0f;
            if (plane.Raycast(pointer.ray, out enter))
            {
                pointer.isHit = true;
                pointer.SetEndPoint(pointer.ray.GetPoint(enter));
            }
        }
    }