Tanoda
RescaleDragPanel.cs
Go to the documentation of this file.
1
3
5
7{
8 [AddComponentMenu("UI/Extensions/RescalePanels/RescaleDragPanel")]
9 public class RescaleDragPanel : MonoBehaviour, IPointerDownHandler, IDragHandler
10 {
11 private Vector2 pointerOffset;
12 private RectTransform canvasRectTransform;
13 private RectTransform panelRectTransform;
14
15 private Transform goTransform;
16
17 void Awake()
18 {
19 Canvas canvas = GetComponentInParent<Canvas>();
20 if (canvas != null)
21 {
22 canvasRectTransform = canvas.transform as RectTransform;
23 panelRectTransform = transform.parent as RectTransform;
24 goTransform = transform.parent;
25 }
26 }
27
28 public void OnPointerDown(PointerEventData data)
29 {
30 panelRectTransform.SetAsLastSibling();
31 RectTransformUtility.ScreenPointToLocalPointInRectangle(panelRectTransform, data.position, data.pressEventCamera, out pointerOffset);
32 }
33
34 public void OnDrag(PointerEventData data)
35 {
36 if (panelRectTransform == null)
37 return;
38
39 Vector2 pointerPosition = ClampToWindow(data);
40
41 Vector2 localPointerPosition;
42 if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
43 canvasRectTransform, pointerPosition, data.pressEventCamera, out localPointerPosition
44 ))
45 {
46 panelRectTransform.localPosition = localPointerPosition - new Vector2(pointerOffset.x * goTransform.localScale.x, pointerOffset.y * goTransform.localScale.y);
47 }
48 }
49
50 Vector2 ClampToWindow(PointerEventData data)
51 {
52 Vector2 rawPointerPosition = data.position;
53
54 Vector3[] canvasCorners = new Vector3[4];
55 canvasRectTransform.GetWorldCorners(canvasCorners);
56
57 float clampedX = Mathf.Clamp(rawPointerPosition.x, canvasCorners[0].x, canvasCorners[2].x);
58 float clampedY = Mathf.Clamp(rawPointerPosition.y, canvasCorners[0].y, canvasCorners[2].y);
59
60 Vector2 newPointerPosition = new Vector2(clampedX, clampedY);
61 return newPointerPosition;
62 }
63 }
64}
void OnPointerDown(PointerEventData data)
Credit Erdener Gonenc - @PixelEnvision.