直接看效果好了,我只弄了两张图片。支持左右滑动。
大致实现原理是滑动快结束时进行每个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