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

没有标题


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

	**OK先上成品**

Unity制作滑动切换页面以及点击页面事件_第1张图片

Unity制作滑动切换页面以及点击页面事件_第2张图片

Unity制作滑动切换页面以及点击页面事件_第3张图片

Unity制作滑动切换页面以及点击页面事件_第4张图片

然后是我们得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 posList = new List();//每页的开始PosX值 第0页就是0开始
    private int currentPageIndex = -1;
    public Action 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();
        RectTransform _rectTras = GetComponent();
        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();这里有个坑 就是 每次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.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

你可能感兴趣的:(UnityUGUI)