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

猜你喜欢

转载自blog.csdn.net/Le_Sam/article/details/85388026
今日推荐