using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class ManualScroller : MonoBehaviour, IScrollHandler, IPointerEnterHandler, IPointerExitHandler { public RectTransform viewport; public RectTransform content; public Slider slider; public float scrollSpeed = 50.0f; private bool isMouseOver = false; //private Vector2 lastDragPosition; void Start() { slider.onValueChanged.AddListener(OnSliderValueChanged); } public void OnScroll(PointerEventData eventData) { if (!isMouseOver) return; Vector2 pos = content.anchoredPosition; float max = content.rect.height - viewport.rect.height; pos.y -= eventData.scrollDelta.y * scrollSpeed; if (pos.y < 0) pos.y = 0; if (pos.y > max) pos.y = max; content.anchoredPosition = pos; slider.value = pos.y / max; } //public void OnBeginDrag(PointerEventData eventData) //{ // if (!isMouseOver) return; // // lastDragPosition = eventData.position; //} //public void OnDrag(PointerEventData eventData) //{ // if (!isMouseOver) return; // // Vector2 delta = eventData.position - lastDragPosition; // Vector2 pos = content.anchoredPosition; // pos.y += delta.y; // content.anchoredPosition = pos; // lastDragPosition = eventData.position; //} public void OnPointerEnter(PointerEventData eventData) { isMouseOver = true; } public void OnPointerExit(PointerEventData eventData) { isMouseOver = false; } public void OnSliderValueChanged(float v) { Vector2 pos = content.anchoredPosition; float max = content.rect.height - viewport.rect.height; pos.y = max * v; content.anchoredPosition = pos; } }