killapp/Assets/Scripts/UI/Components/VerticalScrollLoader.cs

69 lines
2.0 KiB
C#
Raw Permalink Normal View History

2026-06-08 08:55:10 +08:00
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>();
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();
}
}
/// <summary>
/// 加载完成后调用此方法
/// </summary>
public void OnLoadComplete()
{
isLoading = false;
}
/// <summary>
/// 当所有数据加载完成时调用此方法,停止触发加载
/// </summary>
public void SetAllDataLoaded()
{
allDataLoaded = true;
}
/// <summary>
/// 重置加载状态(当有新数据可加载时调用)
/// </summary>
public void ResetLoader()
{
allDataLoaded = false;
isLoading = false;
}
}
}