Unity制作滑动切换页面以及点击页面事件

没有标题


最近在做一个小游戏的时候遇到了切换页面选择工具,但是这个有简单也有复杂,接下来我们就开始吧,还有就是在Demo里面遇到得坑 我也会总结出来,第一次发表博客希望大家多多支持

	**OK先上成品**

在这里插入图片描述

在这里插入图片描述

ViewPort 我们只需要一个MASK组件其他删除

Content我们整一个Layout方便子物体得布局  已经ToggleGroup管理所有子Toggle

在这里插入图片描述

然后是我们得PageController代码部分

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;

public class PageController : MonoBehaviour,IBeginDragHandler,IEndDragHandler {

    // Use this for initialization

    private ScrollRect rect;
    private float tergetHorizontal = 0;  //滑动的起始坐标
    private bool isDrag = false;
    private List<float> posList = new List<float>();//每页的开始PosX值 第0页就是0开始
    private int currentPageIndex = -1;
    public Action<int> OnPageChanged;
    public RectTransform Content;

    private bool stopMOVE = true;

    public float Smooting = 4;  //滑动速度
    public float Sensitivity = 0;

    private float startTime;

    private float startHorizontal = 0;
    public ToggleGroup ToggleParent;
    public HorizontalLayoutGroup Horizontal;

    int newIndex = -1;
    void Start()
    {
        rect =GetComponent<ScrollRect>();
        RectTransform _rectTras = GetComponent<RectTransform>();
        float tempWidth =( float)Content.childCount * _rectTras.sizeDelta.x+ (Content.childCount-1)*Horizontal.spacing;  //考虑到我们子物体会有间隔
        Content.sizeDelta = new Vector2(tempWidth, _rectTras.rect.height);  //动态改变Content得范围
        //剩余显示的长度  总长度减去 Scrollwell的 长
        float horizontalLrngth = Content.rect.width - _rectTras.rect.width;
  
        for (int i = 0; i < Content.childCount; i++)
        {
           Toggle smallToggle = Content.GetChild(i).GetComponent<Toggle>();这里有个坑 就是 每次new 一个  不然闭包 得到得一直是最后一个实例
            smallToggle.group = ToggleParent;
           // smallToggle.onValueChanged.RemoveAllListeners();
           smallToggle.onValueChanged.AddListener(ifselect => 
           { if (ifselect) toggleEvent(smallToggle); }

          );
            if (i == 0)
            {
            //然后开始保存每一个子物体得开始位置  因为要翻页
                posList.Add(0);continue;
            }
            posList.Add(((_rectTras.rect.width+ Horizontal.spacing) * i )/ horizontalLrngth);
           // print(posList[i]);
        }
    }


    void Update()
    {
       if (!isDrag && !stopMOVE)
       {
           startTime += Time.deltaTime;
           float t = startTime * Smooting;
           rect.horizontalNormalizedPosition = Mathf.Lerp(rect.horizontalNormalizedPosition, tergetHorizontal, t);
           if (t>=1)
           {
               stopMOVE = true;
           }
       }
    }  

    public void PageTo(int index)
    {
        if(index>=0 && index < posList.Count)
        {
            rect.horizontalNormalizedPosition = posList[index];
            setPageIndex(index);
           // GetIndex(index);
        }
    }
    public void GetIndex( int index)
    {
       // var toggle = ToggleParent.GetChild(index).GetComponent<Toggle>();
       // toggle.isOn = true;
    }
    void setPageIndex(int index)
    {
        if (currentPageIndex != index)
        {
            currentPageIndex = index;
            if (OnPageChanged != null)
            {
                OnPageChanged(index);
            }
        }
    }
    public void OnBeginDrag(PointerEventData eventData)
    {
        // throw new System.NotImplementedException();
        isDrag = true;
        //开始拖拽    rect.horizontalNormalizedPosition为滑动值 API可以去看官方
        startHorizontal = rect.horizontalNormalizedPosition;
        //print(rect.horizontalNormalizedPosition);
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        //  throw new System.NotImplementedException();
        float posX = rect.horizontalNormalizedPosition;//记录放手的 位置

        posX += ((posX - startHorizontal) * Sensitivity);

        posX = posX < 1 ? posX : 1;
        posX = posX > 0 ? posX : 0;

        int index = 0;

        float offset = Mathf.Abs(posList[index] - posX);

        for (int i = 1; i < posList.Count; i++)
        {
            float temp = Mathf.Abs(posList[i] - posX);
           // print("offset =" + offset + " and" + "temp=" + temp);
            if (temp<offset)
            {
                index = i;
                offset = temp;
            }


        }

        setPageIndex(index);
        tergetHorizontal = posList[index];
        isDrag = false;
        startTime = 0;
        stopMOVE = false;
    }

   private void toggleEvent(Toggle item)
    {
        switch (item.name)
        {

            case "1":
                print("1");
                break;
            case "2":
                print("2");
                break;
            case "3":
                print("3");
                break;
            case "4":
                print("4");
                break;
            default:
                break;
        }
    }
	

}

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值