ScrollRect滑動優化(四)_Unity—Item圖片輪播效果
阿新 • • 發佈:2018-12-30
直接看效果好了,我只弄了兩張圖片。支援左右滑動。
大致實現原理是滑動快結束時進行每個item下一位置的計算,之後再次滑動。
待會我會上傳demo,喜歡的就直接去下載好了。
註釋自己寫了不少,方便我調整,如果有更好實現的方式,麻煩請告知,網上看無限滑動的例子很多都是動態增減item,我這個是改變每個item的位置來實現無限滑動。
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class Image : MonoBehaviour, IBeginDragHandler, IEndDragHandler { public GameObject image1; public GameObject image2; public Vector3 LeftBorderVct3; public Vector3 RightBorderVct3; public float imageWidth; public List<GameObject> ObjLists = new List<GameObject>(); public List<Vector3> CoreLists; public bool isLeft = true; public bool isMove = true; private float StartPos; private float EndPos; private float Posy; private float Posz; // Use this for initialization void Start () { Posy = image1.transform.position.y; Posz = image1.transform.position.z; imageWidth = image2.transform.position.x - image1.transform.position.x; LeftBorderVct3 = new Vector3(image1.transform.position.x - imageWidth, Posy, Posz); RightBorderVct3 = new Vector3(image2.transform.position.x, Posy, Posz); ObjLists.Add(image1); ObjLists.Add(image2); CheckSowing(); } public void OnBeginDrag(PointerEventData eventData) { Debug.Log("Start: "+ Input.mousePosition.x); StartPos = Input.mousePosition.x; } public void OnEndDrag(PointerEventData eventData) { Debug.Log("End: " + Input.mousePosition.x); EndPos = Input.mousePosition.x; var value = EndPos - StartPos; Debug.Log("value: " + value); if (value <= -20) { isLeft = true; } else if(value >= 20) { isLeft = false; } } string CheckBoundaryValue(Vector3 v1, Vector3 v2, Vector3 v3) { if (Mathf.Abs(v1.x - v2.x) <= 5.0f) { Debug.Log("觸碰左側邊界"); return "left"; } if (Mathf.Abs(v1.x - v3.x) <= 5.0f) { Debug.Log("觸碰右側邊界"); return "right"; } return null; } bool isCheck = true; void CheckSowing() { if (!isCheck) { return; } isCheck = false; if (CoreLists.Count != 0) { CoreLists.Clear(); } CoreLists = new List<Vector3>(); for (int i = 0; i < ObjLists.Count; i++) { var value = CheckBoundaryValue(ObjLists[i].transform.position, LeftBorderVct3, RightBorderVct3); if (!String.IsNullOrEmpty(value)) { if (value == "left") { if (isLeft) { Debug.Log("準備越界了"); Debug.Log("原先位置" + ObjLists[i].transform.position); ObjLists[i].transform.position = new Vector3(RightBorderVct3.x, Posy, Posz); Debug.Log("目標跳轉" + ObjLists[i].transform.position); } } else if (value == "right") { if (!isLeft) { Debug.Log("準備越界了"); Debug.Log("原先位置" + ObjLists[i].transform.position); ObjLists[i].transform.position = new Vector3(LeftBorderVct3.x, Posy, Posz); Debug.Log("目標跳轉" + ObjLists[i].transform.position); } } } } Debug.Log("開始計算各個模組下一位置"); for (int i = 0; i < ObjLists.Count; i++) { if (isLeft) { CoreLists.Add(new Vector3(ObjLists[i].transform.position.x - imageWidth, Posy, Posz)); Debug.LogFormat("開始統計:{0},當前模組位置:{1},下一目標位置:{2}", i, ObjLists[i].transform.position.x, ObjLists[i].transform.position.x - imageWidth); } else { CoreLists.Add(new Vector3(ObjLists[i].transform.position.x + imageWidth, Posy, Posz)); Debug.LogFormat("開始統計:{0},當前模組位置:{1},下一目標位置:{2}", i, ObjLists[i].transform.position.x, ObjLists[i].transform.position.x + imageWidth); } } } void StartExecute() { if (isMove) { for(int i = 0; i < ObjLists.Count;i++) { //Debug.LogFormat("當前模組{2},{0} => {1}", ObjLists[i].transform.position.x, CoreLists[i].x, ObjLists[i].name); ObjLists[i].transform.position = Vector3.Lerp(ObjLists[i].transform.position, CoreLists[i], Time.deltaTime * 1.5f); if (Mathf.Abs(ObjLists[i].transform.position.x - CoreLists[i].x) < 0.5) { Debug.Log("到達目標,開始檢測"); isCheck = true; CheckSowing(); } } } } void Update() { StartExecute(); } }
在結尾附上Demo的連結: https://download.csdn.net/download/le_sam/10887047