Tanoda
ScrollScaler.cs
Go to the documentation of this file.
1using System.Collections;
2using System.Collections.Generic;
3using NaughtyAttributes;
4using UnityEngine;
6using UnityEngine.UI;
7
8[RequireComponent(typeof(RectTransform))]
9public class ScrollScaler : MonoBehaviour
10{
11 public static ScrollScaler Instance { get; private set; }
12
13 public float maxZoom = 1f;
14 public float minZoom = 0.4f;
15 public float step = 0.1f;
16 public float margin = 1500f;
17 public ScrollRect scrollRect;
18 public Scrollbar vertical, horizontal;
19 public CanvasGroup window;
20 private RectTransform rectTransform;
21 private Camera mainCamera;
22
23 private void Start()
24 {
25 Instance = this;
26 rectTransform = GetComponent<RectTransform>();
27 mainCamera = Camera.main;
28 }
29
30 void ResizeRect()
31 {
32 // resize, so that children are inside scrollview
33
34 float biggestOffsetX = 0f;
35 float biggestOffsetY = 0f;
36 foreach(Transform t in transform)
37 {
38 if(!t.hasChanged)
39 continue;
40
41 Vector2 v = t.GetComponent<RectTransform>().anchoredPosition;
42
43 if(Mathf.Abs(v.x) > biggestOffsetX)
44 biggestOffsetX = Mathf.Abs(v.x);
45
46 if(Mathf.Abs(v.y) > biggestOffsetY)
47 biggestOffsetY = Mathf.Abs(v.y);
48 }
49
50 biggestOffsetX *= 2;
51 biggestOffsetY *= 2;
52 biggestOffsetX += margin;
53 biggestOffsetY += margin;
54
55 rectTransform.sizeDelta = new Vector2(biggestOffsetX, biggestOffsetY);
56 }
57
58 void Update()
59 {
60 if (window.alpha < 0.5f) return;
61
62 var ddl = GameObject.Find("Dropdown List");
63 if (ddl) return;
64
65 ResizeRect();
66
67 /* if (rectTransform.offsetMin[0] > -25 || horizontal.value > 0.99f)
68 {
69 rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, rectTransform.offsetMin[0] - 25, rectTransform.sizeDelta.x + 50);
70 rectTransform.anchorMax = Vector2.one;
71 rectTransform.anchorMin = Vector2.zero;
72 }
73 if (rectTransform.offsetMin[1] > -25 || vertical.value < 0.001f)
74 {
75 rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, rectTransform.offsetMin[1] - 25, rectTransform.sizeDelta.y + 50);
76 rectTransform.anchorMax = Vector2.one;
77 rectTransform.anchorMin = Vector2.zero;
78 }
79 if (rectTransform.offsetMax[0] < 25) //|| horizontal.value < 0.001f)
80 {
81 rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, -50, rectTransform.sizeDelta.x + 50);
82 rectTransform.anchorMax = Vector2.one;
83 rectTransform.anchorMin = Vector2.zero;
84 }
85 if (rectTransform.offsetMax[1] < 25) //|| vertical.value > 0.99f)
86 {
87 rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, -50, rectTransform.sizeDelta.y + 50);
88 rectTransform.anchorMax = Vector2.one;
89 rectTransform.anchorMin = Vector2.zero;
90 }
91 Vector3[] v = new Vector3[4];
92 Vector3[] c = new Vector3[4];
93
94
95 rectTransform.GetWorldCorners(v);
96 window.GetComponent<RectTransform>().GetWorldCorners(c);
97
98 if (v[1].x + 25 >= c[1].x)
99 {
100 rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, rectTransform.offsetMin[0] - 25, rectTransform.sizeDelta.x + 25);
101 rectTransform.anchorMax = Vector2.one;
102 rectTransform.anchorMin = Vector2.zero;
103 }
104
105 if (v[1].y < c[1].y + 25)
106 {
107 rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x, rectTransform.sizeDelta.y + 50);
108 } */
109
110 var view = mainCamera.ScreenToViewportPoint(Input.mousePosition);
111 var isOutside = view.x < 0 || view.x > 1 || view.y < 0 || view.y > 1;
112 if (isOutside || !EventSystem.current.IsPointerOverGameObject())
113 {
114 return;
115 }
116
117 var hits = GetEventSystemRaycastResults();
118 var good = false;
119 foreach (var hit in hits)
120 {
121 if (hit.gameObject == gameObject)
122 {
123 good = true;
124 break;
125 }
126 }
127
128 if (!good)
129 return;
130
131 if (Input.mouseScrollDelta.y > 0) //fel
132 {
133 if (transform.localScale.x < maxZoom)
134 {
135 ZoomIn();
136 }
137 }
138
139 if (Input.mouseScrollDelta.y < 0) //le
140 {
141 if (transform.localScale.x > minZoom)
142 {
143 ZoomOut();
144 }
145 }
146 }
147
148 //Gets all event system raycast results of current mouse or touch position.
149 static List<RaycastResult> GetEventSystemRaycastResults()
150 {
151 PointerEventData eventData = new PointerEventData(EventSystem.current) {position = Input.mousePosition};
152 List<RaycastResult> raysastResults = new List<RaycastResult>();
153 EventSystem.current.RaycastAll(eventData, raysastResults);
154 return raysastResults;
155 }
156
157 private void ZoomOut()
158 {
159 if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition,
160 null, out var vec2)) return;
161
162 Vector2 normalizedPoint = Rect.PointToNormalized(rectTransform.rect, vec2);
163
164 transform.localScale += Vector3.one * -step;
165 if (transform.localScale.x < minZoom)
166 {
167 transform.localScale = Vector3.one * minZoom;
168 }
169
170 scrollRect.verticalNormalizedPosition = normalizedPoint.y;
171 scrollRect.horizontalNormalizedPosition = normalizedPoint.x;
172 }
173
174 private void ZoomIn()
175 {
176 if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition,
177 null, out var vec2)) return;
178
179 Vector2 normalizedPoint = Rect.PointToNormalized(rectTransform.rect, vec2);
180
181
182 transform.localScale += Vector3.one * step;
183 if (transform.localScale.x > maxZoom)
184 {
185 transform.localScale = Vector3.one * maxZoom;
186 }
187
188 scrollRect.verticalNormalizedPosition = normalizedPoint.y;
189 scrollRect.horizontalNormalizedPosition = normalizedPoint.x;
190 }
191
192 public void AutoScroll(Vector2 mousePos)
193 {
194 if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, mousePos,
195 null, out var vec2)) return;
196
197
198
199 var hits = GetEventSystemRaycastResults();
200
201 foreach (var hit in hits)
202 {
203 if (hit.gameObject == gameObject)
204 {
205 return;
206 }
207 }
208
209 Vector2 normalizedPoint = Rect.PointToNormalized(rectTransform.rect, vec2);
210
211 scrollRect.verticalNormalizedPosition = Mathf.Lerp(scrollRect.verticalNormalizedPosition, normalizedPoint.y, 0.02f);
212 scrollRect.horizontalNormalizedPosition = Mathf.Lerp(scrollRect.horizontalNormalizedPosition, normalizedPoint.x, 0.02f);
213
214 }
215}
ScrollRect scrollRect
Definition: ScrollScaler.cs:17
Scrollbar vertical
Definition: ScrollScaler.cs:18
Scrollbar horizontal
Definition: ScrollScaler.cs:18
static ScrollScaler Instance
Definition: ScrollScaler.cs:11
void AutoScroll(Vector2 mousePos)
CanvasGroup window
Definition: ScrollScaler.cs:19