/// Credit Mrs. YakaYocha /// Sourced from - https://www.youtube.com/channel/UCHp8LZ_0-iCvl-5pjHATsgw /// Please donate: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=RJ8D9FRFQF9VS using UnityEngine.Events; namespace UnityEngine.UI.Extensions { [RequireComponent(typeof(ScrollRect))] [AddComponentMenu("Layout/Extensions/Vertical Scroller")] public class UIVerticalScroller : MonoBehaviour { [Tooltip("desired ScrollRect")] public ScrollRect scrollRect; [Tooltip("Center display area (position of zoomed content)")] public RectTransform center; [Tooltip("Size / spacing of elements")] public RectTransform elementSize; [Tooltip("Scale = 1/ (1+distance from center * shrinkage)")] public Vector2 elementShrinkage = new Vector2(1f / 200, 1f / 200); [Tooltip("Minimum element scale (furthest from center)")] public Vector2 minScale = new Vector2(0.7f, 0.7f); [Tooltip("Select the item to be in center on start.")] public int startingIndex = -1; [Tooltip("Stop scrolling past last element from inertia.")] public bool stopMomentumOnEnd = true; [Tooltip("Set Items out of center to not interactible.")] public bool disableUnfocused = true; [Tooltip("Button to go to the next page. (optional)")] public GameObject scrollUpButton; [Tooltip("Button to go to the previous page. (optional)")] public GameObject scrollDownButton; [Tooltip("Event fired when a specific item is clicked, exposes index number of item. (optional)")] public IntEvent OnButtonClicked; [Tooltip("Event fired when the focused item is Changed. (optional)")] public IntEvent OnFocusChanged; [HideInInspector] public GameObject[] _arrayOfElements; public int focusedElementIndex { get; private set; } public string result { get; private set; } private float[] distReposition; private float[] distance; //private int elementsDistance; //Scrollable area (content of desired ScrollRect) [HideInInspector] public RectTransform scrollingPanel{ get { return scrollRect.content; } } /// /// Constructor when not used as component but called from other script, don't forget to set the non-optional properties. /// public UIVerticalScroller() { } /// /// Constructor when not used as component but called from other script /// public UIVerticalScroller(RectTransform center, RectTransform elementSize, ScrollRect scrollRect, GameObject[] arrayOfElements) { this.center = center; this.elementSize = elementSize; this.scrollRect = scrollRect; _arrayOfElements = arrayOfElements; } /// /// Awake this instance. /// public void Awake() { if (!scrollRect) { scrollRect = GetComponent(); } if (!center) { Debug.LogError("Please define the RectTransform for the Center viewport of the scrollable area"); } if (!elementSize) { elementSize = center; } if (_arrayOfElements == null || _arrayOfElements.Length == 0) { _arrayOfElements = new GameObject[scrollingPanel.childCount]; for (int i = 0; i < scrollingPanel.childCount; i++) { _arrayOfElements[i] = scrollingPanel.GetChild(i).gameObject; } } } /// /// Recognises and resizes the children. /// /// Starting index. /// Array of elements. public void updateChildren(int startingIndex = -1, GameObject[] arrayOfElements = null) { // Set _arrayOfElements to arrayOfElements if given, otherwise to child objects of the scrolling panel. if (arrayOfElements != null) { _arrayOfElements = arrayOfElements; } else { _arrayOfElements = new GameObject[scrollingPanel.childCount]; for (int i = 0; i < scrollingPanel.childCount; i++) { _arrayOfElements[i] = scrollingPanel.GetChild(i).gameObject; } } // resize the elements to match elementSize rect for (var i = 0; i < _arrayOfElements.Length; i++) { int j = i; _arrayOfElements[i].GetComponent