using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using UnityEngine.EventSystems; namespace CurvedUI { /// /// This component enables accurate object dragging over curved canvas. It supports both mouse and gaze controllers. Add it to your canvas object with image component. /// public class CUI_draggable : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler { Vector2 savedVector; bool isDragged = false; public void OnBeginDrag(PointerEventData data) { Debug.Log("OnBeginDrag"); Vector2 newPos = Vector2.zero; RaycastPosition(out newPos); //save distance from click point to object center to allow for precise dragging savedVector = new Vector2((transform as RectTransform).localPosition.x, (transform as RectTransform).localPosition.y) - newPos; isDragged = true; } public void OnDrag(PointerEventData data) { } public void OnEndDrag(PointerEventData data) { Debug.Log("OnEndDrag"); isDragged = false; } void LateUpdate() { if (!isDragged) return; Debug.Log("OnDrag"); //drag the transform along the mouse. We use raycast to determine its position on curved canvas. Vector2 newPos = Vector2.zero; RaycastPosition(out newPos); //add our initial distance from objects center (transform as RectTransform).localPosition = newPos + savedVector; } void RaycastPosition(out Vector2 newPos) { if (CurvedUIInputModule.ControlMethod == CurvedUIInputModule.CUIControlMethod.MOUSE) { //position when using mouse GetComponentInParent().RaycastToCanvasSpace(Camera.main.ScreenPointToRay(Input.mousePosition), out newPos); } else if (CurvedUIInputModule.ControlMethod == CurvedUIInputModule.CUIControlMethod.GAZE) { //position when using gaze - uses the center of the screen as guiding point. GetComponentInParent().RaycastToCanvasSpace(Camera.main.ScreenPointToRay(new Vector2(Screen.width / 2.0f, Screen.height / 2.0f)), out newPos); } else newPos = Vector2.zero; } } }