Unity-ScrollView實現頁面翻動效果


游戲關卡需要通過觸屏翻動來選擇。

實現:

  • 創建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 }

 

 

 

 右滑體驗感並不好,調整了單個單元格長度、間隙和左偏移值以后還是毫無變化,代碼解釋見注釋,待修改。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM