您好,登錄后才能下訂單哦!
這篇文章主要講解了Unity3D實現分頁系統的方法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
在有些情況下,有很多列表不能一次性顯示完整,需要對其進行分頁處理
先展示下效果圖:
·效果圖一
·效果圖二
總的來說,要考慮到的邏輯情況還是有點的
工程目錄結構如下圖:
在每個UIPage下有一個Image框,用來編輯當前是那一頁,默認activate=false
整個思路是當點擊UIPage獲取里面的頁數數值,根據這個數值刷新下UIPage的Text值
在確定哪個UIPage下的Image的activate為true
將以下腳本組件掛載到UIPage上
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class UIPage : EventTrigger { public Image image = null; public Image GetImage { get { if (image = null) { image = this.transform.GetChild(0).GetComponent<Image>(); } return image; } set { image = value; } } public Text text = null; public Text GetText { get { if (text = null) { text = this.transform.GetChild(1).GetComponent<Text>(); } return text; } set { text = value; } } //點擊UI_Page public override void OnPointerClick(PointerEventData eventData) { if (this.transform.GetChild(1).GetComponent<Text>().text == "..." || this.transform.GetChild(1).GetComponent<Text>().text == "") { return; } PageGrid pg = PageGrid.GetInstance; //如果點擊的是前面幾個ui(點擊的是1-5) if (int.Parse(this.transform.GetChild(1).GetComponent<Text>().text) < PageGrid.GetInstance.uiPageArray.Length) { string text = this.transform.GetChild(1).GetComponent<Text>().text; //更新顯示 PageGrid.GetInstance.UpadateUIPageFromHead(); UIPage uiPage = PageGrid.GetInstance.FindUIPageWithText(text); if (uiPage) { PageGrid.GetInstance.ActivatUIPageImage(this.gameObject); } } //點擊最后幾個(點擊的是最后4個) else if (int.Parse(this.transform.GetChild(1).GetComponent<Text>().text) >= PageGrid.GetInstance.maxPageIndex - 3) { string text = this.transform.GetChild(1).GetComponent<Text>().text; //更新顯示 PageGrid.GetInstance.UpdateUIPageFromEnd(); UIPage uiPage = PageGrid.GetInstance.FindUIPageWithText(text); if (uiPage) { PageGrid.GetInstance.ActivatUIPageImage(uiPage.gameObject); } } else { string text = this.transform.GetChild(1).GetComponent<Text>().text; //更新顯示 PageGrid.GetInstance.UpdateUIPageFromMiddle(text); /*由于數字向后移動,故image顯示位置不需要改變*/ } } }
在做完了UIPage的點擊事件后,需要實現頁面跳轉(左右按鈕的點擊實際也是一個跳轉)
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 管理UIPage /// </summary> public class PageGrid : MonoBehaviour { //在初始化時最大的頁數 public int maxPageIndex = 100; [HideInInspector] public UIPage[] uiPageArray { get; set; } private static PageGrid _instance; public static PageGrid GetInstance { get { if (_instance == null) { _instance = GameObject.FindGameObjectWithTag("pageGrid").GetComponent<PageGrid>(); } return _instance; } } private void Start() { //獲取其子節點UIPage組件 uiPageArray = this.GetComponentsInChildren<UIPage>(); //初始化子節點ui顯示 UpadateUIPageFromHead(); } /// <summary> /// 在UIPage上更新 /// </summary> public void UpadateUIPageFromHead() { //從一開始計數 int headPageIndex = 1; int n_pageHeadIndex = headPageIndex; //頁數大于UIPage數(大于6) if (maxPageIndex > uiPageArray.Length) { foreach (var item in uiPageArray) { //倒數第二個 if (headPageIndex - n_pageHeadIndex == uiPageArray.Length - 2) { item.transform.GetChild(1).GetComponent<Text>().text = "..."; } //倒數第一個 else if (headPageIndex - n_pageHeadIndex == uiPageArray.Length - 1) { item.transform.GetChild(1).GetComponent<Text>().text = maxPageIndex.ToString(); } else { item.transform.GetChild(1).GetComponent<Text>().text = headPageIndex.ToString(); } headPageIndex++; } } //頁數等于UIPage數 else if (maxPageIndex == uiPageArray.Length) { foreach (var item in uiPageArray) { item.transform.GetChild(1).GetComponent<Text>().text = headPageIndex.ToString(); headPageIndex++; } } else { for (int i = 0; i < maxPageIndex; i++) { uiPageArray[i].transform.GetChild(1).GetComponent<Text>().text = headPageIndex.ToString(); headPageIndex++; } } } /// <summary> /// 在UIPage上更新 /// </summary> public void UpdateUIPageFromEnd() { //頁數大于UIPage數(大于6) if (maxPageIndex > uiPageArray.Length) { int count = maxPageIndex; for (int i = uiPageArray.Length - 1; i > 0; i--) { if (i == 0) { uiPageArray[i].transform.GetChild(1).GetComponent<Text>().text = "1"; } else if (i == 1) { uiPageArray[i].transform.GetChild(1).GetComponent<Text>().text = "..."; } else { uiPageArray[i].transform.GetChild(1).GetComponent<Text>().text = count.ToString(); count--; } } } else { int count = 1; for (int i = 0; i < maxPageIndex; i++) { uiPageArray[i].transform.GetChild(1).GetComponent<Text>().text = count.ToString(); count++; } } } /// <summary> /// 在UIPage中間更新 /// </summary> public void UpdateUIPageFromMiddle(string number) { int count = int.Parse(number); for (int i = 0; i < uiPageArray.Length; i++) { if (i == 0) { uiPageArray[i].transform.GetChild(1).GetComponent<Text>().text = "1"; } else if (i == 1 || i == uiPageArray.Length - 2) { uiPageArray[i].transform.GetChild(1).GetComponent<Text>().text = "..."; } else if (i == uiPageArray.Length - 1) { uiPageArray[i].transform.GetChild(1).GetComponent<Text>().text = maxPageIndex.ToString(); } else { uiPageArray[i].transform.GetChild(1).GetComponent<Text>().text = count.ToString(); count++; } } } //需要和服務器交互TODO public void ActivatUIPageImage(GameObject uiPage) { //將全部uiPage的Image取消激活 foreach (var item in uiPageArray) { item.transform.GetChild(0).gameObject.SetActive(false); } uiPage.transform.GetChild(0).gameObject.SetActive(true); } /// <summary> /// 按文本內容查詢 /// </summary> /// <param name="text"></param> public UIPage FindUIPageWithText(string text) { foreach (var item in uiPageArray) { if (item.transform.GetChild(1).GetComponent<Text>().text == text) { return item; } } return null; } private UIPage FindUIPageWithImage() { foreach (var item in uiPageArray) { if (item.transform.GetChild(0).gameObject.activeInHierarchy) { return item; } } return null; } /// <summary> /// 頁面跳轉 /// </summary> public void JumpPage()//這里用于輸入框回車事件 { //獲取輸入信息 string number = GameObject.FindGameObjectWithTag("PageInputField").GetComponent<InputField>().text; if (string.IsNullOrEmpty(number)) { return; } //查詢前面幾個ui(點擊的是1-4) if (int.Parse(number) < PageGrid.GetInstance.uiPageArray.Length - 1) { PageGrid.GetInstance.UpadateUIPageFromHead(); UIPage uiPage = PageGrid.GetInstance.FindUIPageWithText(number); if (uiPage) { GameObject obj = uiPage.gameObject; PageGrid.GetInstance.ActivatUIPageImage(obj); } } //查詢最后幾個(點擊的是最后4個) else if (int.Parse(number) >= PageGrid.GetInstance.maxPageIndex - 3) { PageGrid.GetInstance.UpdateUIPageFromEnd(); UIPage uiPage = PageGrid.GetInstance.FindUIPageWithText(number); if (uiPage) { GameObject obj = uiPage.gameObject; PageGrid.GetInstance.ActivatUIPageImage(obj); } } else { UpdateUIPageFromMiddle(number); UIPage uiPage = PageGrid.GetInstance.FindUIPageWithText(number); if (uiPage) { GameObject obj = uiPage.gameObject; PageGrid.GetInstance.ActivatUIPageImage(obj); } } } /// <summary> /// 跳轉 /// </summary> /// <param name="str"></param> public void JumpPage(string str) { //獲取輸入信息 string number = str; //查詢前面幾個ui(點擊的是1-4) if (int.Parse(number) < PageGrid.GetInstance.uiPageArray.Length - 1) { PageGrid.GetInstance.UpadateUIPageFromHead(); UIPage uiPage = PageGrid.GetInstance.FindUIPageWithText(number); if (uiPage) { GameObject obj = uiPage.gameObject; PageGrid.GetInstance.ActivatUIPageImage(obj); } } //查詢最后幾個(點擊的是最后4個) else if (int.Parse(number) >= PageGrid.GetInstance.maxPageIndex - 3) { PageGrid.GetInstance.UpdateUIPageFromEnd(); UIPage uiPage = PageGrid.GetInstance.FindUIPageWithText(number); if (uiPage) { GameObject obj = uiPage.gameObject; PageGrid.GetInstance.ActivatUIPageImage(obj); } } else { UpdateUIPageFromMiddle(number); UIPage uiPage = PageGrid.GetInstance.FindUIPageWithText(number); if (uiPage) { GameObject obj = uiPage.gameObject; PageGrid.GetInstance.ActivatUIPageImage(obj); } } } /// <summary> /// 頁面選擇按鈕 /// </summary> /// <param name="selection">(向左:-1)( 向右:1)</param> public void OnBtnRight(string selection) { UIPage uiPage = PageGrid.GetInstance.FindUIPageWithImage(); if (uiPage) { //當前頁面是最后一頁或者是第一頁 if (int.Parse(uiPage.transform.GetChild(1).GetComponent<Text>().text) == maxPageIndex && selection == "1" || int.Parse(uiPage.transform.GetChild(1).GetComponent<Text>().text) == 1 && selection == "-1") { return; } else { //跳轉頁面 JumpPage((int.Parse(uiPage.transform.GetChild(1).GetComponent<Text>().text) + int.Parse(selection)).ToString()); } } } }
將該腳本掛載到父節點pageGrid上
最后需要將條形框回車事件綁定上去
這樣一個完成簡單分頁系統
看完上述內容,是不是對Unity3D實現分頁系統的方法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。