using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; namespace Kill.UI.Components { [RequireComponent(typeof(ScrollRect))] public class VerticalScrollLoader : MonoBehaviour { [Header("触发设置")] [Range(0, 1)] [Tooltip("滚动到多少比例时触发加载 (0-1)")] public float triggerThreshold = 0.8f; [Header("事件")] public UnityEvent onLoadTriggered; // 触发加载事件 private ScrollRect scrollRect; private bool isLoading; private bool allDataLoaded; // 标记是否所有数据已加载完成 private void Awake() { scrollRect = GetComponent(); scrollRect.onValueChanged.AddListener(OnScrollValueChanged); allDataLoaded = false; } private void OnScrollValueChanged(Vector2 normalizedPosition) { // 如果正在加载或所有数据已加载完成,则不再触发 if (isLoading || allDataLoaded) return; // 计算当前滚动位置比例(垂直滚动) float scrollPosition = 1 - normalizedPosition.y; // 如果滚动到阈值以下,触发加载 if (scrollPosition >= triggerThreshold) { isLoading = true; onLoadTriggered.Invoke(); } } /// /// 加载完成后调用此方法 /// public void OnLoadComplete() { isLoading = false; } /// /// 当所有数据加载完成时调用此方法,停止触发加载 /// public void SetAllDataLoaded() { allDataLoaded = true; } /// /// 重置加载状态(当有新数据可加载时调用) /// public void ResetLoader() { allDataLoaded = false; isLoading = false; } } }