unity实现翻页按钮功能
更新时间:2020年6月25日 10:34 点击:1711
本文实例为大家分享了unity实现翻页按钮功能的具体代码,供大家参考,具体内容如下
效果图:
UI子父级关系:
代码中也都有加入注释,有不懂可私信我。脚本中用到了对象池,我没有上传,可根据自己需求做相应变动。
脚本:PageBtnPanelC
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; /// <summary> /// 分页按钮面板控制器 /// </summary> public class PageBtnPanelC : MonoBehaviour { private HorizontalLayoutGroup self_HLG; /// <summary> /// 上一页按钮 /// </summary> private Button lastPageBtn; /// <summary> /// 下一页按钮 /// </summary> private Button nextPageBtn; /// <summary> /// 页数的父物体 /// </summary> private RectTransform pageBtnParent; private HorizontalLayoutGroup pageBtnParent_HLG; /// <summary> /// 上一页按钮点击事件 /// </summary> private UnityAction<int> lastPageBtnEvent; /// <summary> /// 下一页按钮点击事件 /// </summary> private UnityAction<int> nextPageBtnEvent; /// <summary> /// 当前显示页面的下标 /// </summary> private int _currentShowPageIndex = 1; public int CurrentShowPageIndex { get { return _currentShowPageIndex; } set { _currentShowPageIndex = value; } } /// <summary> /// 总的页面数 /// </summary> private int totalPageNumber = 0; /// <summary> /// 显示按钮的个数 奇数个 /// </summary> [Header("必须是奇数个,且小于总页数")] private int _showBtnCount = 5; public int ShowBtnCount { get { if (_showBtnCount > totalPageNumber) { _showBtnCount = totalPageNumber; } return _showBtnCount; } set { if (value % 2 == 0) { _showBtnCount = value - 1; } else { _showBtnCount = value; } } } /// <summary> /// 页数按钮 预设体 /// </summary> public GameObject btnPrefabs; /// <summary> /// 页数按钮 存放list /// </summary> public List<PageBtnC> pbcList; private void Start() { Init(); Set(14, 9, (index1) => { Debug.Log("当前显示第:" + CurrentShowPageIndex + "页"); }, (index2) => { Debug.Log("当前显示第:" + CurrentShowPageIndex + "页"); }, (_pageIndex, _pbc) => { Debug.Log("当前显示第:" + CurrentShowPageIndex + "页"); }); } /// <summary> /// 改变显示的状态 /// </summary> void ChangeShowState() { int _showBtnCount = ShowBtnCount; /* 判断是否在可更新范围内,如果在更新范围内,则将CurrentShowPageIndex设置为中心位置的按钮 eg:假设总共有10页(totalPageNumber = 10),显示按钮的个数为7(ShowBtnCount = 7) 则应该在 (ShowBtnCount / 2 + 1) = 4 到 totalPageNumber - ShowBtnCount / 2 = 7 之间设置 如果CurrentShowPageIndex = 5或6 则应该这样显示 1.. 3 4 5 6 7 ..10 如果不在更新范围内, 如果CurrentShowPageIndex = 1或2或3或4 则应该这样显示: 1 2 3 4 5 6 ..10 如果如果CurrentShowPageIndex = 7或8或9或10 则应该这样显示 1.. 5 6 7 8 9 10 */ if (CurrentShowPageIndex >= (ShowBtnCount / 2 + 1) && CurrentShowPageIndex <= (totalPageNumber - ShowBtnCount / 2)) { int _showBtnCount2 = _showBtnCount - 2; _showBtnCount2 /= 2; //判断起始下标 int startIndex = CurrentShowPageIndex - _showBtnCount2; int endIndex = CurrentShowPageIndex + _showBtnCount2; //防止超出 if (startIndex <= 1) { startIndex = 2; } //防止超出 if (endIndex >= totalPageNumber) { endIndex = totalPageNumber - 1; } //计算中心位置按钮的下标 因为showBtnCount不定 int centerIndex = ShowBtnCount / 2; pbcList[centerIndex].Set(CurrentShowPageIndex); //循环设置前面一部分按钮信息 for (int i = 1; i < centerIndex; i++) { pbcList[i].Set(startIndex++); } //循环设置后面一部分按钮信息 for (int i = centerIndex + 1; i < ShowBtnCount - 1; i++) { startIndex++; pbcList[i].Set(startIndex); } } else { //如果点击的是小于等于4的按钮下标 if (CurrentShowPageIndex < (ShowBtnCount / 2 + 1)) { for (int i = 0; i < ShowBtnCount - 1; i++) { pbcList[i].Set(i+1); } }//如果点击的事大于等于7的按钮下标 else if (CurrentShowPageIndex > (totalPageNumber - ShowBtnCount / 2)) { int startNumber = totalPageNumber - ShowBtnCount + 2; for (int i = 1; i < ShowBtnCount; i++) { pbcList[i].Set(startNumber++); } } } /* 判断总显示页数是否大于显示页数 以防止出现这种效果: 例如:totalPageNumber = 7,ShowBtnCount =7 防止出现的效果:1 2 3 4 5 6 ..7 和 1.. 2 3 4 5 6 7 应该出现的效果:1 2 3 4 5 6 7 */ if (totalPageNumber > ShowBtnCount){ _showBtnCount -= 2; _showBtnCount /= 2; if (CurrentShowPageIndex - _showBtnCount - 1 > 1) { pbcList[0].Set(1, "1.."); } else { pbcList[0].Set(1); } if (CurrentShowPageIndex + _showBtnCount + 1 < totalPageNumber) { pbcList[ShowBtnCount - 1].Set(totalPageNumber, ".." + totalPageNumber); } else { pbcList[ShowBtnCount - 1].Set(totalPageNumber); } } } private bool isInit = false; public void Init() { if (isInit) return; isInit = true; pbcList = new List<PageBtnC>(); self_HLG = transform.GetComponent<HorizontalLayoutGroup>(); pageBtnParent = transform.Find("PageIndexParent") as RectTransform; pageBtnParent_HLG = pageBtnParent.GetComponent<HorizontalLayoutGroup>(); lastPageBtn = transform.Find("LastPageBtn").GetComponent<Button>(); lastPageBtn.onClick.AddListener(()=> { if (totalPageNumber <= 0) return; if (CurrentShowPageIndex > 1) { CurrentShowPageIndex--; } ResetPageBtnState(); ChangeShowState(); PageBtnC pbc = GetPBCFromIndex(CurrentShowPageIndex); if (pbc != null) { pbc.SetHighlightColor(); } if (lastPageBtnEvent != null) { lastPageBtnEvent(CurrentShowPageIndex); } }); nextPageBtn = transform.Find("NextPageBtn").GetComponent<Button>(); nextPageBtn.onClick.AddListener(()=> { if (totalPageNumber <= 0) return; if (CurrentShowPageIndex < totalPageNumber) { CurrentShowPageIndex++; } ResetPageBtnState(); ChangeShowState(); PageBtnC pbc = GetPBCFromIndex(CurrentShowPageIndex); if (pbc != null) { pbc.SetHighlightColor(); } if (nextPageBtnEvent != null) { nextPageBtnEvent(CurrentShowPageIndex); } }); } /// <summary> /// 设置信息 /// </summary> /// <param name="totalPageNumber">总页数</param> /// <param name="showBtnCount">显示多少个按钮,填奇数,如果填偶数,则会强制减1,如:填6,则实际为5</param> /// <param name="lastBtnEvent">上一页按钮事件</param> /// <param name="nextBtnEvent">下一页按钮事件</param> /// <param name="pageBtnClickEvent">单独点击页面按钮事件</param> public void Set(int totalPageNumber,int showBtnCount,UnityAction<int> lastBtnEvent,UnityAction<int> nextBtnEvent,UnityAction<int,PageBtnC> pageBtnClickEvent) { if (totalPageNumber <= 0) { this.totalPageNumber = 1; } else { this.totalPageNumber = totalPageNumber; } this.ShowBtnCount = showBtnCount; this.lastPageBtnEvent = lastBtnEvent; this.nextPageBtnEvent = nextBtnEvent; CurrentShowPageIndex = 1; pbcList.Clear(); for (int i = 1; i <= ShowBtnCount; i++) { int index = i; PageBtnC pbc = PoolManager.Instance.Spawn(btnPrefabs, pageBtnParent).GetComponent<PageBtnC>(); if (pbc) { pbc.Set(index,null, (pageIndex,pbc111) => { CurrentShowPageIndex = pageIndex; ResetPageBtnState(); ChangeShowState(); PageBtnC pbc1 = GetPBCFromIndex(CurrentShowPageIndex); if (pbc1 != null) { pbc1.SetHighlightColor(); } if (pageBtnClickEvent != null) { pageBtnClickEvent(pageIndex, pbc111); } }); } pbcList.Add(pbc); } pbcList[0].SetHighlightColor(); ChangeShowState(); Util.SetWidth_ChildWidthSame(pageBtnParent_HLG, pageBtnParent); Util.SetWidth_ChildWidthNotSame(self_HLG, transform as RectTransform); } /// <summary> /// 重置所有按钮的状态 /// </summary> void ResetPageBtnState() { for (int i = 0; i < pbcList.Count; i++) { pbcList[i].SetNormalColor(); } } /// <summary> /// 回收所有页码 /// </summary> public void Unspawn() { for (int i = pageBtnParent.childCount - 1; i >= 0; i--) { PoolManager.Instance.UnSpawn(pageBtnParent.GetChild(i).gameObject); } } public void Clear() { lastPageBtnEvent = null; nextPageBtnEvent = null; } /// <summary> /// 根据index得到pagebtnc物体 /// </summary> /// <param name="index"></param> /// <returns></returns> PageBtnC GetPBCFromIndex(int index) { for (int i = 0; i < pbcList.Count; i++) { if (pbcList[i].CurrentPageIndex.Equals(index)) { return pbcList[i]; } } return null; } } public class Util { /// <summary> /// 设置物体宽度 子物体宽度相同 /// </summary> /// <param name="parentHLG"></param> /// <param name="parent"></param> /// <param name="callback"></param> public static void SetWidth_ChildWidthSame(HorizontalLayoutGroup parentHLG, RectTransform parent, UnityAction<float> endCallBack = null) { float width = 0; float leftPadding = parentHLG.padding.left; float spacing = parentHLG.spacing; int childCount = parent.childCount; if (childCount > 0) { RectTransform singleChildRT = parent.GetChild(0) as RectTransform; width = childCount * singleChildRT.rect.width + (childCount - 1) * spacing + leftPadding; } parent.sizeDelta = new Vector2(width, parent.sizeDelta.y); if (endCallBack != null) { endCallBack(width); } } /// <summary> /// 设置物体宽度 子物体宽度不同 /// </summary> /// <param name="parentHLG"></param> /// <param name="parent"></param> /// <param name="callback"></param> public static void SetWidth_ChildWidthNotSame(HorizontalLayoutGroup parentHLG, RectTransform parent, UnityAction<float> endCallBack = null) { float width = 0; RectOffset Padding = parentHLG.padding; float spacing = parentHLG.spacing; int childCount = parent.childCount; if (childCount > 0) { for (int i = 0; i < childCount; i++) { RectTransform childRT = parent.GetChild(i) as RectTransform; width += childRT.rect.width; } width += (childCount - 1) * spacing + Padding.left + Padding.right; } parent.sizeDelta = new Vector2(width, parent.sizeDelta.y); if (endCallBack != null) { endCallBack(width); } } }
脚本:PageBtnC
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; /// <summary> /// 页码按钮控制器 /// </summary> public class PageBtnC : MonoBehaviour,IPool { /// <summary> /// 自己显示的页码 /// </summary> private int currentPageIndex = 0; public int CurrentPageIndex { get { return currentPageIndex; } } private Button SelfBtn; private Image img; private Text selfText; /// <summary> /// 按钮事件 /// </summary> public UnityAction<int,PageBtnC> btnClickEvent; /// <summary> /// 按钮正常和高亮颜色 /// </summary> public Color normalColor; public Color highlightColor; /// <summary> /// 文本正常和高亮颜色 /// </summary> public Color normalTextColor; public Color highlightTextColor; private bool isInit = false; void Init() { if (isInit) return; isInit = true; img = transform.GetComponent<Image>(); selfText = transform.Find("Text").GetComponent<Text>(); SelfBtn = transform.GetComponent<Button>(); SelfBtn.onClick.AddListener(()=> { if (btnClickEvent != null) { btnClickEvent(currentPageIndex,this); } }); } /// <summary> /// 设置正常颜色 /// </summary> public void SetNormalColor() { img.color = normalColor; selfText.color = normalTextColor; } /// <summary> /// 设置高亮颜色 /// </summary> public void SetHighlightColor() { img.color = highlightColor; selfText.color = highlightTextColor; } /// <summary> /// 设置事件 文本内容等 /// </summary> /// <param name="currentPageIndex"></param> /// <param name="selfTextStr"></param> /// <param name="btnClickEvent"></param> public void Set(int currentPageIndex,string selfTextStr = null,UnityAction<int,PageBtnC> btnClickEvent = null) { this.currentPageIndex = currentPageIndex; if (btnClickEvent != null) { this.btnClickEvent = btnClickEvent; } if (string.IsNullOrEmpty(selfTextStr)) { selfText.text = currentPageIndex.ToString(); } else { selfText.text = selfTextStr; } } #region 对象池接口方法 public int GetMaxCount() { return 10; } public string SingletonName() { return this.GetType().Name; } public void Spawn() { Init(); } public void UnSpawn() { SetNormalColor(); } #endregion }
github地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
上一篇: Unity实现见缝插针小游戏
下一篇: Unity3D实现列表分页效果
相关文章
- 下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
- 这篇文章主要为大家详细解析了BootStrap栅格系统、表单样式与按钮样式源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-01-23
- 这篇文章主要为大家详细介绍了Unity时间戳的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了C#使用浏览按钮获得文件路径和文件夹路径的方法,结合实例形式分析了C#浏览器事件响应及文件操作相关技巧,需要的朋友可以参考下...2020-06-25
- 在淘宝等购物网站,我们都会看到一个发送短信倒计时的按钮,究竟是如何实现的呢?下面小编通过本篇文章给大家分享一段代码关于js实现手机短信按钮倒计时,需要的朋友参考下...2016-01-02
- 这篇文章主要为大家介绍了python编程使用PyQt5如何创建按钮及触发点击事件的示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-10-29
Unity中 ShaderGraph 实现旋涡传送门效果入门级教程(推荐)
通过Twirl 旋转节点对Gradient Noise 梯度噪声节点进行操作,就可得到一个旋转的旋涡效果。具体实现代码跟随小编一起通过本文学习下吧...2021-07-11- 这篇文章主要为大家详细介绍了jquery mobile实现可折叠的导航按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-03-13
- 本文主要介绍了4种延时执行的方法,主要包括Update计时器,Invoke,协程,DoTween,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-07
- 这篇文章主要介绍了微信小程序将页面按钮悬浮固定在底部的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-10-29
- javascript代码判断按钮是否被点击了在项目中经常会遇到这个需求,今天小编抽点时间给大家分享一段代码关于javascript判断按钮是否被点击的方法,感兴趣的朋友一起学习吧...2015-12-14
- 这篇文章主要介绍了javascript+css3 实现动态按钮菜单特效的相关资料,需要的朋友可以参考下...2016-02-12
- 这篇文章主要为大家详细介绍了Unity shader实现遮罩效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了unity 判断鼠标是否在哪个UI上的两种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-10
- 这篇文章主要为大家详细介绍了Unity实现换装系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-11
- 这篇文章主要为大家详细介绍了vue实现自定义多选按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-07-16
- 这篇文章主要介绍了如何在.Net版本UEditor中添加一个普通按钮,需要的朋友可以参考下...2021-09-22
- 这篇文章主要给大家介绍了关于利用unity代码C#封装为dll的相关资料,文中通过图文将实现的方法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了Angular2搜索和重置按钮过场动画,需要的朋友可以参考下...2017-05-27
- 这篇文章主要为大家详细介绍了Unity Shader实现径向模糊效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-09