예제 #1
0
    void UpdateTarget()
    {
        Vector3 fwd = transform.TransformDirection(Vector3.forward);

        RaycastHit[] hits;

        hits = Physics.RaycastAll(transform.position, fwd, 20);
        bool            canvasHit    = false;
        bool            editPlaneHit = false;
        List <ImageHit> imagesHit    = new List <ImageHit>();
        List <ImageHit> framesHit    = new List <ImageHit> ();

        // List<ImageHit> menuOptionsHit = new List<ImageHit> ();

        foreach (RaycastHit hit in hits)
        {
            if (hit.collider.gameObject.tag == "Image")
            {
                imagesHit.Add(new ImageHit(hit.collider.gameObject, hit.point));
                continue;
            }

            if (hit.collider.gameObject.tag == "Frame")
            {
                framesHit.Add(new ImageHit(hit.collider.gameObject, hit.point));
                continue;
            }

            if (hit.collider.gameObject.tag == "MainCanvas")
            {
                canvasHitAt = hit.point;
                canvasHit   = true;
                continue;
            }

            if (hit.collider.gameObject.tag == "MenuOption")
            {
                currentTarget = new ImageHit(hit.collider.gameObject, hit.point);
                return;
            }

            if (hit.collider.gameObject.tag == "Temp")
            {
                editPlaneHitAt = hit.point;
                editPlaneHit   = true;
                continue;
            }
        }

        if (!editPlaneHit)
        {
            editPlaneHitAt = default(Vector3);
        }

        if (!canvasHit)
        {
            crosshair.HideCrosshair();
            ray.UpdateRay();
            canvasHitAt = default(Vector3);
        }
        else
        {
            if (layerManager.HasSelectedFrames() && controller.trackpadDown)
            {
                crosshair.HideCrosshair();
                HideRay();
            }
        }

        List <Layer> sortedLayers = layerManager.GetLayers();
        bool         imageFound   = false;

        foreach (Layer layer in sortedLayers)
        {
            foreach (ImageHit imgHit in imagesHit)
            {
                if (layer.layerImage == imgHit.target.GetComponent <Image>())
                {
                    imageFound = true;
                    if (currentTarget.target != imgHit.target)
                    {
                        controller.Vibrate(vibrationForce);
                    }
                    currentTarget = imgHit;
                    break;
                }
            }
            if (imageFound)
            {
                break;
            }
        }

        // If no image have been hit but a frame has, take the first frame hit and set it as the current target
        if (!imageFound)
        {
            if (framesHit.Count > 0 && layerManager.rearrangementMode)
            {
                currentTarget = framesHit [0];
            }
            else
            {
                currentTarget = default(ImageHit);
            }
        }

        if (!HasTarget() && canvasHit)
        {
            ray.UpdateRay(Vector3.Distance(transform.position, canvasHitAt));
            crosshair.ShowCrosshair();
            crosshair.MoveCrosshair(canvasHitAt);
        }

        if (HasTarget())
        {
            crosshair.HideCrosshair();
        }
    }