【Unity】ScrollRect实现翻页效果

项目中有个需求,新手教程的玩法说明的界面展示中,需要实现翻页效果,且翻页的元素个数会动态变化,具体实现:
其中组件的设置在下面这个图
在这里插入图片描述
在这里插入图片描述
我这里因为是全屏翻页,所以其中滑动元素都是满屏适配的

        float width = scrollRect.GetComponent<RectTransform>().rect.width;
        scrollRect.content.GetComponent<HorizontalLayoutGroup>().spacing = width;
        space = width;

根据适配获得屏幕宽度,也就是子元素的宽度,再将HorizontalLayoutGroup的间隔设为屏幕宽度,可以详细看我的HorizontalLayoutGroup组件的版面设置,然后记录这个宽度就可以知道每一页的位置了,就可以随意滑动到指定位置了

下面是我项目中这个页面的代码,主要看怎么做动态修改子元素个数的滑动翻页哈,并且用到了Dotween,忽略我代码的混乱-

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public class TipsPop : MonoBehaviour, UIInterface
{

    public ScrollRect scrollRect;

    public List<GameObject> typeList1 = new List<GameObject>();
    public List<GameObject> typeList2 = new List<GameObject>();
    public List<GameObject> typeList3 = new List<GameObject>();
    public List<GameObject> typeList4 = new List<GameObject>();

    private float space;

    private float firstPos;

    private int pageIndex;

    private int pageNum;

    private List<GameObject> pageList = new List<GameObject>();
    private List<GameObject> dotList = new List<GameObject>();

    public bool IsVisible => gameObject.activeInHierarchy;

    public void Close()
    {
        gameObject.SetActive(false);
    }

    public GameObject GetGameObject()
    {
        return gameObject;
    }

    public UIEnum.UIPanelName GetName()
    {
        return UIEnum.UIPanelName.TipsPop;
    }

    public void Show()
    {
        gameObject.SetActive(true);
    }

    /// <summary>
    /// 1经典 2无尽 3挑战 4首页
    /// </summary>
    /// <param name="type"></param>
    public void Init(int type)
    {
        for (int i = 0; i < scrollRect.content.childCount; i++)
        {
            scrollRect.content.GetChild(i).gameObject.SetActive(false);
        }
        switch(type)
        {
            case 1: pageList = typeList1; break;
            case 2: pageList = typeList2; break;
            case 3: pageList = typeList3; break;
            case 4: pageList = typeList4; break;
        }
        foreach(var obj in pageList)
        {
            obj.SetActive(true);
        }
        float width = scrollRect.GetComponent<RectTransform>().rect.width;
        scrollRect.content.GetComponent<HorizontalLayoutGroup>().spacing = width;
        space = width;
        pageNum = 0;
        for (int i = 0;i < scrollRect.content.childCount; i++)
        {
            if(scrollRect.content.GetChild(i).gameObject.activeInHierarchy)
            {
                pageNum++;
            }
        }
        pageIndex = 0;
        firstPos = (width / 2) * (pageNum - 1);

        Transform dots = transform.Find("Dots");
        for(int i = 0; i < dots.childCount; i++)
        {
            dotList.Add(dots.GetChild(i).gameObject);
        }

        scrollRect.content.transform.localPosition = new Vector3(firstPos, 0, 0);
        RefreshBtnAndDot();
    }

    public void ClickNext()
    {
        if(pageIndex == pageNum - 1)
        {
            Close();
            return;
        }
        pageIndex++;
        //scrollRect.content.transform.localPosition = new Vector3((pageIndex + 1) * space, 0, 0);
        scrollRect.content.transform.DOLocalMoveX(firstPos - pageIndex * space, 0.5f);
        RefreshBtnAndDot();
    }

    private void RefreshBtnAndDot()
    {
        pageList[pageIndex].transform.Find("BG").Find("Btn_Next").Find("Text").gameObject.GetComponent<Text>().text = pageIndex >= pageNum - 1 ? "Got it" : "Next";
        
        for(int i = 0; i < dotList.Count; i++)
        {
            dotList[i].SetActive(i < pageNum);
            dotList[i].transform.Find("Light").gameObject.SetActive(pageIndex == i);
        }
    
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值