DaoNiaoShu_Dog/Assets/_Scripts/FrameworkYiLiao/Scroll/ScrollViewHorizontalClickMove.cs

59 lines
1.8 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
/// <summary>
/// 单点
/// </summary>
public class ScrollViewHorizontalClickMove : MonoBehaviour
{
ScrollRect scrollRect; // 引用ScrollRect组件
public float smoothTime = 0.3f; // 平滑过渡的时间
public float stepDistance = 0.16f; // 移动的距离
private float targetPosition; // 目标滚动位置
private bool isScrolling = false; // 是否正在滚动
private void Start()
{
scrollRect = GetComponent<ScrollRect>();
}
public void ScrollLeft()
{
StartCoroutine(SmoothScroll(-stepDistance)); // 假设每次点击向左滚动一小部分
}
public void ScrollRight()
{
StartCoroutine(SmoothScroll(stepDistance)); // 假设每次点击向右滚动一小部分
}
private IEnumerator SmoothScroll(float direction)
{
if (isScrolling) yield break; // 如果已经在滚动,则不开始新的滚动
isScrolling = true;
float elapsedTime = 0f;
float lerp = 0f;
// 计算开始时的当前位置和目标位置
float startPosition = scrollRect.horizontalNormalizedPosition;
targetPosition = Mathf.Clamp(startPosition + direction, 0f, 1f); // 确保目标位置在有效范围内
// 循环直到达到目标位置或超过平滑时间
while (lerp < 1f && elapsedTime < smoothTime)
{
elapsedTime += Time.deltaTime;
lerp = Mathf.SmoothStep(0f, 1f, elapsedTime / smoothTime); // 使用SmoothStep函数进行平滑插值
// 根据插值计算新的滚动位置
float newPosition = Mathf.Lerp(startPosition, targetPosition, lerp);
scrollRect.horizontalNormalizedPosition = newPosition;
// 等待下一帧
yield return null;
}
// 确保最终位置与目标位置一致
scrollRect.horizontalNormalizedPosition = targetPosition;
isScrolling = false;
}
}