using System.Collections; using System.Collections.Generic; using System.Threading; using UnityEngine; using UnityEngine.UI; public class ScrollTest2 : MonoBehaviour { // Start is called before the first frame update private ScrollRect scroll; private Transform content; private float contentSize; private int count; [SerializeField] Button L, R; void Start() { scroll = gameObject.GetComponent(); content = gameObject.transform.Find("Viewport").Find("Content"); count = content.childCount; contentSize = 1f / (content.childCount - 2); scroll.horizontalNormalizedPosition = contentSize / 2; SetColor(); if (L != null) { L.onClick.AddListener(goLeft); } if (R != null) { R.onClick.AddListener(goRight); } } void goLeft() { if (scroll.horizontalNormalizedPosition <= contentSize) return; if (!start) startPosition = scroll.horizontalNormalizedPosition; start = true; scrollValue = -1 * contentSize / 30; } void goRight() { if ((scroll.horizontalNormalizedPosition + contentSize) >= 1) return; if (!start) startPosition = scroll.horizontalNormalizedPosition; start = true; scrollValue = contentSize / 30; } private bool start = false, _lock = false; private float scrollValue = 0, totalScrollValue = 0, startPosition = 0; void SetColor() { int index = (int)System.Math.Round( (scroll.horizontalNormalizedPosition + (contentSize / 2)) / contentSize, 0); for (int i = 1; i < content.childCount-1; i++) { string c = "#FFF"; if (i == index) { c = "#FF2742"; } ColorUtility.TryParseHtmlString(c, out Color color); content.GetChild(i).Find("Image").GetComponent().color = color; } } // Update is called once per frame void Update() { if (start) { totalScrollValue += scrollValue; if (System.Math.Abs(totalScrollValue) >= contentSize) { scrollValue = 0; start = false; scroll.horizontalNormalizedPosition = startPosition + totalScrollValue; //Debug.Log(); SetColor(); totalScrollValue = 0; } else { scroll.horizontalNormalizedPosition += scrollValue; } } } }