Unity 无限滑动图片展示

在这里插入图片描述
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勾选表示使用鼠标,否则触摸屏

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值