59 lines
1.8 KiB
C#
59 lines
1.8 KiB
C#
|
|
using UnityEngine;
|
|||
|
|
using UnityEngine.UI;
|
|||
|
|
using System.Collections;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public class ScrollViewHorizontalClickMove : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
ScrollRect scrollRect; // <20><><EFBFBD><EFBFBD>ScrollRect<63><74><EFBFBD><EFBFBD>
|
|||
|
|
public float smoothTime = 0.3f; // ƽ<><C6BD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
public float stepDistance = 0.16f; // <20>ƶ<EFBFBD><C6B6>ľ<EFBFBD><C4BE><EFBFBD>
|
|||
|
|
private float targetPosition; // Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
|
private bool isScrolling = false; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD>
|
|||
|
|
|
|||
|
|
private void Start()
|
|||
|
|
{
|
|||
|
|
scrollRect = GetComponent<ScrollRect>();
|
|||
|
|
}
|
|||
|
|
public void ScrollLeft()
|
|||
|
|
{
|
|||
|
|
StartCoroutine(SmoothScroll(-stepDistance)); // <20><><EFBFBD><EFBFBD>ÿ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һС<D2BB><D0A1><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void ScrollRight()
|
|||
|
|
{
|
|||
|
|
StartCoroutine(SmoothScroll(stepDistance)); // <20><><EFBFBD><EFBFBD>ÿ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҹ<EFBFBD><D2B9><EFBFBD>һС<D2BB><D0A1><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private IEnumerator SmoothScroll(float direction)
|
|||
|
|
{
|
|||
|
|
if (isScrolling) yield break; // <20><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>µĹ<C2B5><C4B9><EFBFBD>
|
|||
|
|
|
|||
|
|
isScrolling = true;
|
|||
|
|
float elapsedTime = 0f;
|
|||
|
|
float lerp = 0f;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>㿪ʼʱ<CABC>ĵ<EFBFBD>ǰλ<C7B0>ú<EFBFBD>Ŀ<EFBFBD><C4BF>λ<EFBFBD><CEBB>
|
|||
|
|
float startPosition = scrollRect.horizontalNormalizedPosition;
|
|||
|
|
targetPosition = Mathf.Clamp(startPosition + direction, 0f, 1f); // ȷ<><C8B7>Ŀ<EFBFBD><C4BF>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>Χ<EFBFBD><CEA7>
|
|||
|
|
|
|||
|
|
// ѭ<><D1AD>ֱ<EFBFBD><D6B1><EFBFBD>ﵽĿ<EFB5BD><C4BF>λ<EFBFBD>û<C3BB>ƽ<EFBFBD><C6BD>ʱ<EFBFBD><CAB1>
|
|||
|
|
while (lerp < 1f && elapsedTime < smoothTime)
|
|||
|
|
{
|
|||
|
|
elapsedTime += Time.deltaTime;
|
|||
|
|
lerp = Mathf.SmoothStep(0f, 1f, elapsedTime / smoothTime); // ʹ<><CAB9>SmoothStep<65><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ݲ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>µĹ<C2B5><C4B9><EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
|
float newPosition = Mathf.Lerp(startPosition, targetPosition, lerp);
|
|||
|
|
scrollRect.horizontalNormalizedPosition = newPosition;
|
|||
|
|
|
|||
|
|
// <20>ȴ<EFBFBD><C8B4><EFBFBD>һ֡
|
|||
|
|
yield return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>λ<EFBFBD><CEBB>һ<EFBFBD><D2BB>
|
|||
|
|
scrollRect.horizontalNormalizedPosition = targetPosition;
|
|||
|
|
isScrolling = false;
|
|||
|
|
}
|
|||
|
|
}
|