11 [RequireComponent(typeof(ScrollRect))]
12 [AddComponentMenu(
"Layout/Extensions/Vertical Scroll Snap")]
18 _childAnchorPoint =
new Vector2(0.5f,0);
20 panelDimensions = gameObject.GetComponent<RectTransform>().rect;
26 if (!_lerp && _scroll_rect.velocity == Vector2.zero)
28 if (!_settled && !_pointerDown)
30 if (!IsRectSettledOnaPage(_screensContainer.anchoredPosition))
32 ScrollToClosestElement();
39 _screensContainer.anchoredPosition = Vector3.Lerp(_screensContainer.anchoredPosition, _lerp_target,
transitionSpeed * (
UseTimeScale ? Time.deltaTime : Time.unscaledDeltaTime));
40 if (Vector3.Distance(_screensContainer.anchoredPosition, _lerp_target) < 0.1f)
42 _screensContainer.anchoredPosition = _lerp_target;
48 CurrentPage = GetPageforPosition(_screensContainer.anchoredPosition);
53 if (_scroll_rect.velocity.y > 0.01 || _scroll_rect.velocity.y < -0.01)
56 if (IsRectMovingSlowerThanThreshold(0))
58 ScrollToClosestElement();
64 private bool IsRectMovingSlowerThanThreshold(
float startingSpeed)
72 _screens = _screensContainer.childCount;
73 _scroll_rect.verticalNormalizedPosition = 0;
77 Rect panelDimensions = gameObject.GetComponent<RectTransform>().rect;
78 float currentYPosition = 0;
79 var pageStepValue = _childSize = (int)panelDimensions.height * ((
PageStep == 0) ? 3 :
PageStep);
81 for (
int i = 0; i < _screensContainer.transform.childCount; i++)
83 RectTransform child = _screensContainer.transform.GetChild(i).gameObject.GetComponent<RectTransform>();
84 currentYPosition = _offset + i * pageStepValue;
85 child.sizeDelta =
new Vector2(panelDimensions.width, panelDimensions.height);
86 child.anchoredPosition =
new Vector2(0f, currentYPosition);
87 child.anchorMin = child.anchorMax = child.pivot = _childAnchorPoint;
90 _dimension = currentYPosition + _offset * -1;
92 _screensContainer.GetComponent<RectTransform>().offsetMax =
new Vector2(0f, _dimension);
109 public void AddChild(GameObject GO,
bool WorldPositionStays)
111 _scroll_rect.verticalNormalizedPosition = 0;
112 GO.transform.SetParent(_screensContainer, WorldPositionStays);
113 InitialiseChildObjectsFromScene();
117 SetScrollContainerPosition();
138 public void RemoveChild(
int index,
bool WorldPositionStays, out GameObject ChildRemoved)
141 if (index < 0 || index > _screensContainer.childCount)
145 _scroll_rect.verticalNormalizedPosition = 0;
147 Transform child = _screensContainer.transform.GetChild(index);
148 child.SetParent(
null, WorldPositionStays);
149 ChildRemoved = child.gameObject;
150 InitialiseChildObjectsFromScene();
154 if (_currentPage > _screens - 1)
159 SetScrollContainerPosition();
178 var _screenCount = _screensContainer.childCount;
179 ChildrenRemoved =
new GameObject[_screenCount];
181 for (
int i = _screenCount - 1; i >= 0; i--)
183 ChildrenRemoved[i] = _screensContainer.GetChild(i).gameObject;
184 ChildrenRemoved[i].transform.SetParent(
null, WorldPositionStays);
187 _scroll_rect.verticalNormalizedPosition = 0;
189 InitialiseChildObjectsFromScene();
194 private void SetScrollContainerPosition()
196 _scrollStartPosition = _screensContainer.anchoredPosition.y;
197 _scroll_rect.verticalNormalizedPosition = (float)(_currentPage) / (_screens - 1);
198 OnCurrentScreenChange(_currentPage);
209 SetScrollContainerPosition();
210 OnCurrentScreenChange(_currentPage);
213 private void OnRectTransformDimensionsChange()
215 if (_childAnchorPoint != Vector2.zero)
221 private void OnEnable()
223 InitialiseChildObjectsFromScene();
235 public override void OnEndDrag(PointerEventData eventData)
237 _pointerDown =
false;
239 if (_scroll_rect.vertical)
243 ScrollToClosestElement();
247 var distance = Vector3.Distance(_startPosition, _screensContainer.anchoredPosition);
250 _scroll_rect.velocity = Vector3.zero;
254 if (_startPosition.y - _screensContainer.anchoredPosition.y > 0)
265 ScrollToClosestElement();
270 if (
UseFastSwipe && distance < panelDimensions.height + FastSwipeThreshold && distance >= 1f)
272 _scroll_rect.velocity = Vector3.zero;
273 if (_startPosition.y - _screensContainer.anchoredPosition.y > 0)
275 if (_startPosition.y - _screensContainer.anchoredPosition.y > _childSize / 3)
277 ScrollToClosestElement();
286 if (_startPosition.y - _screensContainer.anchoredPosition.y > -_childSize / 3)
288 ScrollToClosestElement();
Credit Erdener Gonenc - @PixelEnvision.