69 lines
2.0 KiB
C#
69 lines
2.0 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|