Unity使用ScrollRect製作翻頁
阿新 • • 發佈:2020-04-18
本文例項為大家分享了使用ScrollRect製作翻頁的具體程式碼,供大家參考,具體內容如下
1.標準的層級結構 ScrollRect->ViewPort->Content,Viewport負責顯示區域的大小一般和Mask一起配合使用,Content使用Layout來佈局,如果想使用程式碼來自動定位顯示位置需要在Content加上Content size filter.
2.ScrollRectHelper
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections.Generic; using System; public class ScrollRectHelper : MonoBehaviour,IBeginDragHandler,IEndDragHandler { // 滑動速度 public float smooting = 5; // 每頁顯示的專案 [SerializeField] private int countPerPage = 10; ScrollRect srect; // 總頁數 float totalPages; // 是否拖拽結束 bool isDrag = false; // 總頁數索引比列 0-1 List<float> listPageValue = new List<float> { 0 }; // 滑動的目標位置 public float targetPos = 0; // 當前位置索引 float nowindex = 0; void Awake() { srect = GetComponent<ScrollRect>(); } public string PageText() { return (nowindex + 1) + "/" + (totalPages + 1); } // 計算每頁比例 public void CalcListPageValue<T>() where T : MonoBehaviour { T[] items = srect.content.GetComponentsInChildren<T>(); srect.content.rect.Set(srect.content.rect.width / 2,srect.content.rect.y,srect.content.rect.width,srect.content.rect.height); totalPages = (int)(Math.Ceiling((float)items.Length / countPerPage) - 1); if (items.Length != 0) { for (float i = 1; i <= totalPages; i++) { //Debug.Log(i / totalPages); listPageValue.Add((i / totalPages)); } } } void Update() { if (!isDrag) { srect.horizontalNormalizedPosition = Mathf.Lerp(srect.horizontalNormalizedPosition,targetPos,Time.deltaTime * smooting); } // Debug if (Input.GetKeyDown(KeyCode.LeftArrow)) PressLeft(); if (Input.GetKeyDown(KeyCode.RightArrow)) PressRight(); } /// <summary> /// 拖動開始 /// </summary> /// <param name="eventData"></param> public void OnBeginDrag(PointerEventData eventData) { isDrag = true; } /// <summary> /// 拖拽結束 /// </summary> /// <param name="eventData"></param> public void OnEndDrag(PointerEventData eventData) { isDrag = false; var tempPos = srect.horizontalNormalizedPosition; //獲取拖動的值 var index = 0; float offset = Mathf.Abs(listPageValue[index] - tempPos); //拖動的絕對值 for (int i = 1; i < listPageValue.Count; i++) { float temp = Mathf.Abs(tempPos - listPageValue[i]); if (temp < offset) { index = i; offset = temp; } } targetPos = listPageValue[index]; nowindex = index; } public void PressLeft() { nowindex = Mathf.Clamp(nowindex - 1,totalPages); targetPos = listPageValue[Convert.ToInt32(nowindex)]; } public void PressRight() { nowindex = Mathf.Clamp(nowindex + 1,totalPages); targetPos = listPageValue[Convert.ToInt32(nowindex)]; } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。