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)); }