项目中有个需求,新手教程的玩法说明的界面展示中,需要实现翻页效果,且翻页的元素个数会动态变化,具体实现:
其中组件的设置在下面这个图
我这里因为是全屏翻页,所以其中滑动元素都是满屏适配的
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);
}
}
}