11 [RequireComponent(typeof(ScrollRect))]
12 [AddComponentMenu(
"Layout/Extensions/Horizontal Scroll Snap")]
18 _childAnchorPoint =
new Vector2(0, 0.5f);
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.x > 0.01 || _scroll_rect.velocity.x < -0.01)
56 if (IsRectMovingSlowerThanThreshold(0))
58 ScrollToClosestElement();
64 private bool IsRectMovingSlowerThanThreshold(
float startingSpeed)
72 _screens = _screensContainer.childCount;
73 _scroll_rect.horizontalNormalizedPosition = 0;
77 Rect panelDimensions = gameObject.GetComponent<RectTransform>().rect;
78 float currentXPosition = 0;
79 var pageStepValue = _childSize = (int)panelDimensions.width * ((
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 currentXPosition = _offset + i * pageStepValue;
85 child.sizeDelta =
new Vector2(panelDimensions.width, panelDimensions.height);
86 child.anchoredPosition =
new Vector2(currentXPosition, 0f);
87 child.anchorMin = child.anchorMax = child.pivot = _childAnchorPoint;
90 _dimension = currentXPosition + _offset * -1;
92 _screensContainer.GetComponent<RectTransform>().offsetMax =
new Vector2(_dimension, 0f);
109 public void AddChild(GameObject GO,
bool WorldPositionStays)
111 _scroll_rect.horizontalNormalizedPosition = 0;
112 GO.transform.SetParent(_screensContainer, WorldPositionStays);
113 InitialiseChildObjectsFromScene();
118 SetScrollContainerPosition();
139 public void RemoveChild(
int index,
bool WorldPositionStays, out GameObject ChildRemoved)
142 if (index < 0 || index > _screensContainer.childCount)
146 _scroll_rect.horizontalNormalizedPosition = 0;
148 Transform child = _screensContainer.transform.GetChild(index);
149 child.SetParent(
null, WorldPositionStays);
150 ChildRemoved = child.gameObject;
151 InitialiseChildObjectsFromScene();
156 if (_currentPage > _screens - 1)
161 SetScrollContainerPosition();
180 var _screenCount = _screensContainer.childCount;
181 ChildrenRemoved =
new GameObject[_screenCount];
183 for (
int i = _screenCount - 1; i >= 0; i--)
185 ChildrenRemoved[i] = _screensContainer.GetChild(i).gameObject;
186 ChildrenRemoved[i].transform.SetParent(
null, WorldPositionStays);
189 _scroll_rect.horizontalNormalizedPosition = 0;
191 InitialiseChildObjectsFromScene();
197 private void SetScrollContainerPosition()
199 _scrollStartPosition = _screensContainer.anchoredPosition.x;
200 _scroll_rect.horizontalNormalizedPosition = (float)(_currentPage) / (_screens - 1);
201 OnCurrentScreenChange(_currentPage);
213 SetScrollContainerPosition();
214 OnCurrentScreenChange(_currentPage);
217 private void OnRectTransformDimensionsChange()
219 if (_childAnchorPoint != Vector2.zero)
225 private void OnEnable()
227 InitialiseChildObjectsFromScene();
233 SetScrollContainerPosition();
242 public override void OnEndDrag(PointerEventData eventData)
244 _pointerDown =
false;
246 if (_scroll_rect.horizontal)
250 ScrollToClosestElement();
254 var distance = Vector3.Distance(_startPosition, _screensContainer.anchoredPosition);
258 _scroll_rect.velocity = Vector3.zero;
262 if (_startPosition.x - _screensContainer.anchoredPosition.x > 0)
273 ScrollToClosestElement();
280 _scroll_rect.velocity = Vector3.zero;
281 if (_startPosition.x - _screensContainer.anchoredPosition.x > 0)
283 if (_startPosition.x - _screensContainer.anchoredPosition.x > _childSize / 3)
285 ScrollToClosestElement();
294 if (_startPosition.x - _screensContainer.anchoredPosition.x < -_childSize / 3)
296 ScrollToClosestElement();
Credit Erdener Gonenc - @PixelEnvision.