先上效果
代码 挂到Scroll View上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI ;
public class ScrollRectControl : MonoBehaviour
{
private ScrollRect scrollRect;
public int MenuCount = 8;
private bool IsScrollbarDown = false;
void Start()
{
scrollRect = GetComponent<ScrollRect>();
if (scrollRect==null)
{
Debug.Log("[Error:没有找到ScrollRect组件]");
enabled = false;
}
EventTrigger eventTrigger= scrollRect.gameObject.AddComponent<EventTrigger>();
EventTrigger.TriggerEvent triggerEvent = new EventTrigger.TriggerEvent();
triggerEvent.AddListener(ScrollBeginDrag);
eventTrigger.triggers.Add(new EventTrigger.Entry() { eventID = EventTriggerType.BeginDrag, callback = triggerEvent } ) ;
triggerEvent = new EventTrigger.TriggerEvent();
triggerEvent.AddListener(ScrollEndDrag);
eventTrigger.triggers.Add(new EventTrigger.Entry() { eventID = EventTriggerType.EndDrag, callback = triggerEvent });
triggerEvent = new EventTrigger.TriggerEvent();
triggerEvent.AddListener(ScrollDrag);
eventTrigger.triggers.Add(new EventTrigger.Entry() { eventID = EventTriggerType.Drag, callback = triggerEvent });
}
private float StartingValue;
public void ScrollBeginDrag(BaseEventData eventHandle)
{
IsScrollbarDown = true;
}
public void ScrollDrag(BaseEventData eventHandle)
{
}
private int Dir = 0;
public void ScrollEndDrag(BaseEventData eventHandle)
{
Lerpvalue = GetScrollRectScrollbarValue(scrollRect.horizontalScrollbar.value, MenuCount);
IsScrollbarDown = false;
}
private float Lerpvalue = 0;
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
Left();
}
if (Input.GetKeyDown(KeyCode.S))
{
Right();
}
if (!IsScrollbarDown)
{
scrollRect.horizontalScrollbar.value = Mathf.Lerp(scrollRect.horizontalScrollbar.value, Lerpvalue, Time.deltaTime * 10f);
}
}
public void Left()
{
float meanvalue = 1f / /*(float)*/((float)MenuCount - 1f);
Lerpvalue = GetScrollRectScrollbarValue(scrollRect.horizontalScrollbar.value- meanvalue, MenuCount);
RefreshButton();
}
public void Right()
{
float meanvalue = 1f / /*(float)*/((float)MenuCount - 1f);
Lerpvalue = GetScrollRectScrollbarValue(scrollRect.horizontalScrollbar.value + meanvalue, MenuCount);
RefreshButton();
}
public Button LeftButt;
public Button RightButt;
public void RefreshButton()
{
LeftButt.interactable = Lerpvalue < 1 && MenuCount > 1;
RightButt.interactable = Lerpvalue > 0 && MenuCount > 1;
}
/// <summary>
/// 获取 ScrollRectScrollbarValue
/// </summary>
/// <param name="currentValue">当前ScrollbarValue</param>
/// <param name="nodeNumber">节点数量</param>
/// <returns>居中value</returns>
public float GetScrollRectScrollbarValue(float currentValue, int nodeNumber)
{
//注:节点是从左至右的
//把 Scrollbar 分段 这里需要-1 ;例如 8个对象 其实分7段就可以了
float meanvalue = 1f / /*(float)*/((float)nodeNumber - 1f);
//保存当前 Scrollbar 的值
float value = currentValue;
// 计算 当前 Scrollbar 的值 中有多少个 meanvalue (就是每段的长度)
float differenceValue = ((value + (meanvalue / 2f)) / meanvalue);
//然后取整 这样就计算出来 当前值位于第几个节点处
int num = (int)differenceValue;
//通过计算出来的节点序号 计算出大致的一个位置
float centerValue = num * meanvalue;
centerValue = centerValue < 0 ? 0 : centerValue > 1 ? 1 : centerValue;
return centerValue;
}
public Text Text;
}