16 [RequireComponent(typeof(RectTransform))]
17 [AddComponentMenu(
"UI/Extensions/UI Window Base")]
18 public class UIWindowBase : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
20 private bool _isDragging =
false;
22 private Vector3 m_originalCoods = Vector3.zero;
23 private Canvas m_canvas;
24 private RectTransform m_canvasRectTransform;
26 [Tooltip(
"Number of pixels of the window that must stay inside the canvas view.")]
29 [Tooltip(
"The transform that is moved when dragging, can be left empty in which case its own transform is used.")]
41 m_canvas = GetComponentInParent<Canvas>();
42 m_canvasRectTransform = m_canvas.GetComponent<RectTransform>();
48 resetCoordinatePosition();
51 public void OnDrag(PointerEventData eventData)
55 var delta = ScreenToCanvas(eventData.position) - ScreenToCanvas(eventData.position - eventData.delta);
64 if (eventData.pointerCurrentRaycast.gameObject ==
null)
67 if (eventData.pointerCurrentRaycast.gameObject.name == name)
78 void resetCoordinatePosition()
84 private Vector3 ScreenToCanvas(Vector3 screenPosition)
86 Vector3 localPosition;
89 var canvasSize = m_canvasRectTransform.sizeDelta;
91 if (m_canvas.renderMode == RenderMode.ScreenSpaceOverlay || (m_canvas.renderMode == RenderMode.ScreenSpaceCamera && m_canvas.worldCamera ==
null))
93 localPosition = screenPosition;
100 var ray = m_canvas.worldCamera.ScreenPointToRay(screenPosition);
101 var plane =
new Plane(m_canvasRectTransform.forward, m_canvasRectTransform.position);
104 if (plane.Raycast(ray, out distance) ==
false)
106 throw new Exception(
"Is it practically possible?");
108 var worldPosition = ray.origin + ray.direction * distance;
109 localPosition = m_canvasRectTransform.InverseTransformPoint(worldPosition);
111 min = -Vector2.Scale(canvasSize, m_canvasRectTransform.pivot);
112 max = Vector2.Scale(canvasSize, Vector2.one - m_canvasRectTransform.pivot);
119 return localPosition;
Includes a few fixes of my own, mainly to tidy up duplicates, remove unneeded stuff and testing....
void OnDrag(PointerEventData eventData)
void OnEndDrag(PointerEventData eventData)
RectTransform RootTransform
void OnBeginDrag(PointerEventData eventData)
Credit Erdener Gonenc - @PixelEnvision.