void UpdateTransform()
        {
            Vector3 positionInCanvasSpace = mySettings.transform.worldToLocalMatrix.MultiplyPoint3x4(this.transform.parent.position);

            transform.position = mySettings.CanvasToCurvedCanvas(positionInCanvasSpace);
            transform.rotation = Quaternion.LookRotation(mySettings.CanvasToCurvedCanvasNormal(transform.parent.localPosition), transform.parent.up);
        }
        #pragma warning restore 0649



        // Update is called once per frame
        void Update()
        {
            Vector3 worldSpaceMousePosInWorldSpace = MouseCanvas.CanvasToCurvedCanvas(WorldSpaceMouse.localPosition);
            Ray     ControllerRay = new Ray(Camera.main.transform.position, worldSpaceMousePosInWorldSpace - Camera.main.transform.position);

            CurvedUIInputModule.CustomControllerRay = ControllerRay;


            if (Input.GetButton("Fire2"))
            {
                Vector2 newPos = Vector2.zero;
                MouseCanvas.RaycastToCanvasSpace(new Ray(Camera.main.transform.position, Camera.main.transform.forward), out newPos);
                CurvedUIInputModule.Instance.WorldSpaceMouseInCanvasSpace = newPos;
            }

            Debug.DrawRay(ControllerRay.GetPoint(0), ControllerRay.direction * 1000, Color.cyan);
        }
        public override void Raycast(PointerEventData eventData, List <RaycastResult> resultAppendList)
        {
            if (!mySettings.Interactable)
            {
                return;
            }

            //check if we have a world camera to process events by
            if (myCanvas.worldCamera == null)
            {
                Debug.LogWarning("CurvedUIRaycaster requires Canvas to have a world camera reference to process events!", myCanvas.gameObject);
            }

            Camera worldCamera = myCanvas.worldCamera;
            Ray    ray3D;

            //get a ray to raycast with depending on the control method
            switch (mySettings.Controller)
            {
            case CurvedUISettings.CurvedUIController.MOUSE:
            {
                // Get a ray from the camera through the point on the screen - used for mouse input
                ray3D = worldCamera.ScreenPointToRay(eventData.position);
                break;
            }

            case CurvedUISettings.CurvedUIController.GAZE:
            {
                //get a ray from the center of world camera. used for gaze input
                ray3D = new Ray(worldCamera.transform.position, worldCamera.transform.forward);

                bool selectableUnderGaze = false;

                //find if our selected object is still under gaze
                foreach (GameObject go in eventData.hovered)
                {
                    if (go == eventData.selectedObject)
                    {
                        selectableUnderGaze = true;
                        break;
                    }
                }

                //deselect if its not
                if (!selectableUnderGaze)
                {
                    eventData.selectedObject = null;
                }

                foreach (GameObject go in eventData.hovered)
                {
                    if (go == null)
                    {
                        continue;
                    }

                    Graphic gph = go.GetComponent <Graphic>();

                    //go through only go that can be selected and are drawn by the canvas
#if UNITY_5_1
                    if (go.GetComponent <Selectable>() != null && gph != null && gph.depth != -1)
#else
                    if (go.GetComponent <Selectable>() != null && gph != null && gph.depth != -1 && gph.raycastTarget)
#endif
                    {
                        if (eventData.selectedObject != go)
                        {
                            eventData.selectedObject = go;
                        }

                        break;
                    }
                }

                //Test for selected object being dragged and initialize dragging, if needed.
                //We do this here to trick unity's StandAloneInputModule into thinking we used a touch or mouse to do it.
                if (eventData.IsPointerMoving() && eventData.pointerDrag != null &&
                    !eventData.dragging &&
                    ShouldStartDrag(eventData.pressPosition, eventData.position, EventSystem.current.pixelDragThreshold, eventData.useDragThreshold))
                {
                    ExecuteEvents.Execute(eventData.pointerDrag, eventData, ExecuteEvents.beginDragHandler);
                    eventData.dragging = true;
                }


                break;
            }

            case CurvedUISettings.CurvedUIController.WORLD_MOUSE:
            {
                // Get a ray set in CustromControllerRay property
                ray3D = new Ray(worldCamera.transform.position, (mySettings.CanvasToCurvedCanvas(mySettings.WorldSpaceMouseInCanvasSpace) - myCanvas.worldCamera.transform.position));
                break;
            }

            case CurvedUISettings.CurvedUIController.VIVE:
            {
                // Get a ray from right controller.

#if CURVEDUI_VIVE
                ray3D = new Ray((eventData as CurvedUIPointerEventData).Controller.transform.position, (eventData as CurvedUIPointerEventData).Controller.transform.forward);

                break;
#else
                goto case CurvedUISettings.CurvedUIController.CUSTOM_RAY;
#endif
            }

            case CurvedUISettings.CurvedUIController.CUSTOM_RAY:
            {
                // Get a ray set in CustromControllerRay property
                ray3D = mySettings.CustomControllerRay;

                break;
            }

            default:
            {
                ray3D = new Ray();
                break;
            }
            }

            if (mySettings.Angle != 0 && mySettings.enabled)
            { // use custom raycasting only if Curved effect is enabled
                Vector2 remappedPosition = eventData.position;

                //Test only this object's layer if settings require it.
                int myLayerMask = -1;
                if (mySettings.RaycastMyLayerOnly)
                {
                    myLayerMask = 1 << this.gameObject.layer;
                }

                switch (mySettings.Shape)
                {
                //find if we hit anything, if not, do nothing
                case CurvedUISettings.CurvedUIShape.CYLINDER:
                {
                    if (!RaycastToCyllinderCanvas(ray3D, out remappedPosition, false, myLayerMask))
                    {
                        return;
                    }
                    break;
                }

                case CurvedUISettings.CurvedUIShape.CYLINDER_VERTICAL:
                {
                    if (!RaycastToCyllinderVerticalCanvas(ray3D, out remappedPosition, false, myLayerMask))
                    {
                        return;
                    }
                    break;
                }

                case CurvedUISettings.CurvedUIShape.RING:
                {
                    if (!RaycastToRingCanvas(ray3D, out remappedPosition, false, myLayerMask))
                    {
                        return;
                    }
                    break;
                }

                case CurvedUISettings.CurvedUIShape.SPHERE:
                {
                    if (!RaycastToSphereCanvas(ray3D, out remappedPosition, false, myLayerMask))
                    {
                        return;
                    }
                    break;
                }
                }

                // Update event data
                eventData.position = remappedPosition;

                //update delta for vive
                if (mySettings.Controller == CurvedUISettings.CurvedUIController.VIVE)
                {
                    eventData.delta = remappedPosition - lastCanvasPos;
                    lastCanvasPos   = remappedPosition;
                }
            }

            //store objects under pointer so they can quickly retrieved if needed by other scripts
            lastHovered = eventData.hovered;

            // Use base class raycast method to finish the raycast if we hit anything
            base.Raycast(eventData, resultAppendList);
        }
 // Update is called once per frame
 void Update()
 {
     transform.position = mySettings.CanvasToCurvedCanvas(this.transform.parent.localPosition);
     transform.rotation = Quaternion.LookRotation(mySettings.CanvasToCurvedCanvasNormal(this.transform.parent.localPosition));
 }