1. 程式人生 > >ScrollRect滑動優化(四)_Unity—Item圖片輪播效果

ScrollRect滑動優化(四)_Unity—Item圖片輪播效果

 直接看效果好了,我只弄了兩張圖片。支援左右滑動。
大致實現原理是滑動快結束時進行每個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