游戲關卡需要通過觸屏翻動來選擇。
實現:
- 創建panel后在面板下邊創建UI-ScrollView,在content下完成當前游戲所需UI。
示例游戲面板:
- 掛載腳本到ScrollVeiw組件下方,代碼如下。
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.UI; 5 using UnityEngine.EventSystems; 6 using System; 7 using DG.Tweening; 8 9 public class SlideScrollView : MonoBehaviour,IBeginDragHandler,IEndDragHandler { 10 11 private RectTransform contentTrans; 12 private float beginMousePositionX; 13 private float endMousePositionX; 14 private ScrollRect scrollRect; 15 16 public int cellLength; 17 public int spacing; 18 public int leftOffset; 19 private float moveOneItemLength; 20 21 private Vector3 currentContentLocalPos; 22 23 public int totalItemNum; 24 public int currentIndex; 25 26 private void Awake() 27 { 28 scrollRect = GetComponent<ScrollRect>(); 29 contentTrans = scrollRect.content; 30 moveOneItemLength = cellLength + spacing; //移動一個單元格所需距離 31 currentContentLocalPos = contentTrans.localPosition; //UI一出現就把content記錄下位置做初始值 32 currentIndex = 1; 33 } 34 35 public void OnEndDrag(PointerEventData eventData) 36 { 37 endMousePositionX = Input.mousePosition.x; //結束拖拽時也要取得鼠標終止位置 38 float offSetX = 0; //差值先賦值 39 float moveDistance = 0; //具體要去移動的距離 當次需要滑動的距離 40 offSetX = beginMousePositionX - endMousePositionX; 41 42 if (offSetX > 0) //差值如果大於0就是 右滑 43 { 44 if (currentIndex >= totalItemNum) //如果已經滑到最右端了就不能動了 45 { 46 return; 47 } 48 moveDistance = moveOneItemLength; 49 currentIndex++; 50 } 51 else //否則左滑 52 { 53 if (currentIndex <= 1) //已經滑動到最左端 54 { 55 return; 56 } 57 moveDistance = moveOneItemLength; 58 currentIndex--; 59 } 60 DOTween.To(() => contentTrans.localPosition, lerpValue => contentTrans.localPosition = lerpValue, currentContentLocalPos + new Vector3(moveDistance,0,0),0.3f).SetEase(Ease.Linear); 61 //想要改變局部坐標 令當前的局部坐標=計算出來的差值 想要達到:當前存在的位置+當次需要具體移動的位置(上邊計算出來的移動距離,y和z不需要移動) 0.5s完成移動 最后是緩動函數 62 currentContentLocalPos += new Vector3(moveDistance, 0, 0); 63 } 64 65 public void OnBeginDrag(PointerEventData eventData) 66 { 67 beginMousePositionX = Input.mousePosition.x; //取鼠標起始位置 68 } 69 }
右滑體驗感並不好,調整了單個單元格長度、間隙和左偏移值以后還是毫無變化,代碼解釋見注釋,待修改。