1 Grid 和子物体锚点设置如下
2 脚本挂在Grid上面
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
public class TestScroll : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public enum GuessDir
{
//无
none = 0,
//左
left = 1,
//右
right = 2
}
Scrollbar scrollBar;
float x;
GuessDir dir = GuessDir.none;
float k;
private Coroutine con;
void Start()
{
scrollBar = GameObject.Find("Scrollbar").GetComponentInChildren<Scrollbar>();
dir = GuessDir.none;
k = 1f / 1500; // 1500 是Grid总宽度 - 1个子物体的宽度
}
public void OnBeginDrag(PointerEventData eventData)
{
if (eventData.pointerEnter == null)
{
return;
}
x = Input.GetAxis("Mouse X");
if (x < 0)
{
dir = GuessDir.left;
if (scrollBar.value < 1)
{
if (con != null)
{
StopCoroutine(con);
}
con = StartCoroutine(OnScrollLerpRight(dir, eventData.pointerEnter.transform));
}
}
else if (x > 0)
{
dir = GuessDir.right;
if (scrollBar.value > 0)
{
if (con != null)
{
StopCoroutine(con);
}
con = StartCoroutine(OnScrollLerpRight(dir, eventData.pointerEnter.transform));
}
}
}
IEnumerator OnScrollLerpRight(GuessDir dir, Transform trans)
{
while (true)
{
if (dir == GuessDir.right)
{
scrollBar.value = Mathf.Lerp(scrollBar.value, (trans.localPosition.x - 750) * k, 0.05f); //750是每张图的宽度
if (scrollBar.value == (trans.localPosition.x - 750) * k)
{
break;
}
}
else if (dir == GuessDir.left)
{
scrollBar.value = Mathf.Lerp(scrollBar.value, (trans.localPosition.x + 750) * k, 0.05f);
if (scrollBar.value == (trans.localPosition.x + 750) * k)
{
break;
}
}
yield return 1;
}
}
public void OnDrag(PointerEventData eventData)
{
}
public void OnEndDrag(PointerEventData eventData)
{
}
}