Unity3D UGUI之ScrollRect锁定对象 简单模式

先上效果
请添加图片描述
代码 挂到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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值