Tanoda
UIWindowBase.cs
Go to the documentation of this file.
1
6
7
8using System;
10
12{
16 [RequireComponent(typeof(RectTransform))]
17 [AddComponentMenu("UI/Extensions/UI Window Base")]
18 public class UIWindowBase : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
19 {
20 private bool _isDragging = false;
21 public static bool ResetCoords = false;
22 private Vector3 m_originalCoods = Vector3.zero;
23 private Canvas m_canvas;
24 private RectTransform m_canvasRectTransform;
25
26 [Tooltip("Number of pixels of the window that must stay inside the canvas view.")]
27 public int KeepWindowInCanvas = 5;
28
29 [Tooltip("The transform that is moved when dragging, can be left empty in which case its own transform is used.")]
30 public RectTransform RootTransform = null;
31
32 // Use this for initialization
33 void Start()
34 {
35 if (RootTransform == null)
36 {
37 RootTransform = GetComponent<RectTransform>();
38 }
39
40 m_originalCoods = RootTransform.position;
41 m_canvas = GetComponentInParent<Canvas>();
42 m_canvasRectTransform = m_canvas.GetComponent<RectTransform>();
43 }
44
45 void Update()
46 {
47 if (ResetCoords)
48 resetCoordinatePosition();
49 }
50
51 public void OnDrag(PointerEventData eventData)
52 {
53 if (_isDragging)
54 {
55 var delta = ScreenToCanvas(eventData.position) - ScreenToCanvas(eventData.position - eventData.delta);
56 RootTransform.localPosition += delta;
57 }
58 }
59
60 //Note, the begin drag and end drag aren't actually needed to control the drag. However, I'd recommend keeping it in case you want to do something else when dragging starts and stops
61 public void OnBeginDrag(PointerEventData eventData)
62 {
63
64 if (eventData.pointerCurrentRaycast.gameObject == null)
65 return;
66
67 if (eventData.pointerCurrentRaycast.gameObject.name == name)
68 {
69 _isDragging = true;
70 }
71 }
72
73 public void OnEndDrag(PointerEventData eventData)
74 {
75 _isDragging = false;
76 }
77
78 void resetCoordinatePosition()
79 {
80 RootTransform.position = m_originalCoods;
81 ResetCoords = false;
82 }
83
84 private Vector3 ScreenToCanvas(Vector3 screenPosition)
85 {
86 Vector3 localPosition;
87 Vector2 min;
88 Vector2 max;
89 var canvasSize = m_canvasRectTransform.sizeDelta;
90
91 if (m_canvas.renderMode == RenderMode.ScreenSpaceOverlay || (m_canvas.renderMode == RenderMode.ScreenSpaceCamera && m_canvas.worldCamera == null))
92 {
93 localPosition = screenPosition;
94
95 min = Vector2.zero;
96 max = canvasSize;
97 }
98 else
99 {
100 var ray = m_canvas.worldCamera.ScreenPointToRay(screenPosition);
101 var plane = new Plane(m_canvasRectTransform.forward, m_canvasRectTransform.position);
102
103 float distance;
104 if (plane.Raycast(ray, out distance) == false)
105 {
106 throw new Exception("Is it practically possible?");
107 };
108 var worldPosition = ray.origin + ray.direction * distance;
109 localPosition = m_canvasRectTransform.InverseTransformPoint(worldPosition);
110
111 min = -Vector2.Scale(canvasSize, m_canvasRectTransform.pivot);
112 max = Vector2.Scale(canvasSize, Vector2.one - m_canvasRectTransform.pivot);
113 }
114
115 // keep window inside canvas
116 localPosition.x = Mathf.Clamp(localPosition.x, min.x + KeepWindowInCanvas, max.x - KeepWindowInCanvas);
117 localPosition.y = Mathf.Clamp(localPosition.y, min.y + KeepWindowInCanvas, max.y - KeepWindowInCanvas);
118
119 return localPosition;
120 }
121 }
122}
Includes a few fixes of my own, mainly to tidy up duplicates, remove unneeded stuff and testing....
Definition: UIWindowBase.cs:19
void OnDrag(PointerEventData eventData)
Definition: UIWindowBase.cs:51
void OnEndDrag(PointerEventData eventData)
Definition: UIWindowBase.cs:73
void OnBeginDrag(PointerEventData eventData)
Definition: UIWindowBase.cs:61
Credit Erdener Gonenc - @PixelEnvision.