unity滑动展示内容,无限滑动,自动吸附
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;
public class SliderControT : MonoBehaviour
{
public bool isMouse;
public List<GameObject> List_Box;
public List<Vector3> Vec_Sta;
public float speed = 10f;
public float maxMouseSpeed = 10f;
public float maxScreenSpeed = 100f;
public float ScreenSpeed = 100f;
public int currentCard;
private float minZ;
public float speedAutoAdsorb;
private bool dirAutoAdsorb;
public bool onAutoAdsorb;
public float scale = 500;
private void OnEnable()
{
onAutoAdsorb = false;
}
void Start()
{
VecStaSet();
Reset();
}
private void VecStaSet()
{
for(int i = 0; i < List_Box.Count; i++)
{
Vec_Sta.Add(new Vector3((i * 1f - 4) * scale, 0, 0));
}
}
private void Update()
{
if(isMouse)
{
if (Input.GetMouseButton(0))
{
float x = Input.GetAxis("Mouse X");
x = Mathf.Clamp(x, -maxMouseSpeed, maxMouseSpeed);
Debug.Log(x);
SliderChange(x);
}
if (Input.GetMouseButtonUp(0))
{
if (List_Box[currentCard].transform.localPosition.x > 0)
{
dirAutoAdsorb = true;
}
else if (List_Box[currentCard].transform.localPosition.x < 0)
{
dirAutoAdsorb = false;
}
onAutoAdsorb = true;
}
}
else
{
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
{
Touch touch = Input.GetTouch(0);
float touchSwipeX = touch.deltaPosition.x / Screen.width * ScreenSpeed;
touchSwipeX = Mathf.Clamp(touchSwipeX, -maxScreenSpeed, maxScreenSpeed);
Debug.Log(touchSwipeX);
SliderChange(touchSwipeX);
}
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended)
{
if (List_Box[currentCard].transform.localPosition.x > 0)
{
dirAutoAdsorb = true;
}
else if (List_Box[currentCard].transform.localPosition.x < 0)
{
dirAutoAdsorb = false;
}
onAutoAdsorb = true;
}
}
if (onAutoAdsorb)
{
if (dirAutoAdsorb)
{
SliderChange(-speedAutoAdsorb);
if (List_Box[currentCard].transform.localPosition.x <= 0)
{
onAutoAdsorb = false;
}
}
else
{
SliderChange(speedAutoAdsorb);
if (List_Box[currentCard].transform.localPosition.x >= 0)
{
onAutoAdsorb = false;
}
}
}
}
private void Reset()
{
for(int i = 0; i < List_Box.Count; i++)
{
List_Box[i].gameObject.transform.localPosition = Vec_Sta[i];
}
SliderChange(0);
}
void SliderChange(float value)
{
minZ = 1 * scale;
for (int i = 0; i < List_Box.Count; i++)
{
Vector3 pos = List_Box[i].transform.localPosition;
if (Mathf.Abs(List_Box[i].transform.localPosition.x) < 1 * scale)
{
float t = (1 * scale - Mathf.Abs(List_Box[i].transform.localPosition.x)) / 1.0f;
pos.y = 1 * t;
}
else
{
pos.y = 0;
}
pos.x += (value * speed * Time.deltaTime);
List_Box[i].transform.localPosition = pos;
if (List_Box[i].transform.localPosition.x < -4 * scale)
{
List_Box[i].GetComponent<UnityEngine.UI.Image>().color = new Color(1, 1, 1, 0);
}
else if (List_Box[i].transform.localPosition.x < -3 * scale)
{
float t = (4 * scale + List_Box[i].transform.localPosition.x) / scale;
List_Box[i].GetComponent<UnityEngine.UI.Image>().color = new Color(1, 1, 1, t);
}
else if (List_Box[i].transform.localPosition.x > 4 * scale)
{
List_Box[i].GetComponent<UnityEngine.UI.Image>().color = new Color(1, 1, 1, 0);
}
else if (List_Box[i].transform.localPosition.x > 3 * scale)
{
float t = (4 * scale - List_Box[i].transform.localPosition.x) / scale;
List_Box[i].GetComponent<UnityEngine.UI.Image>().color = new Color(1, 1, 1, t);
}
else
{
List_Box[i].GetComponent<UnityEngine.UI.Image>().color = new Color(1, 1, 1, 1f);
}
if (List_Box[i].transform.localPosition.x < -4.1f * scale)
{
if (i == 0)
{
float posZ = List_Box[List_Box.Count - 1].transform.localPosition.x;
List_Box[i].transform.localPosition = new Vector3(posZ + 1 * scale, 0, 0);
}
else
{
float posZ = List_Box[i - 1].transform.localPosition.x;
List_Box[i].transform.localPosition = new Vector3(posZ + 1 * scale, 0, 0);
}
}
else if (List_Box[i].transform.localPosition.x > List_Box.Count * scale - 3.9f * scale)
{
if (i == List_Box.Count - 1)
{
float posZ = List_Box[0].transform.localPosition.x;
List_Box[i].transform.localPosition = new Vector3(posZ - 1 * scale, 0, 0);
}
else
{
float posZ = List_Box[i + 1].transform.localPosition.x;
List_Box[i].transform.localPosition = new Vector3(posZ - 1 * scale, 0, 0);
}
}
float deltaZ = Mathf.Abs(List_Box[i].transform.localPosition.x);
if (deltaZ < minZ)
{
minZ = deltaZ;
currentCard = i;
}
}
}
public void OnPointerClick(int index)
{
Debug.Log(index);
}
}
参考数值,isMouse勾选表示使用鼠标,否则触摸屏