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勾选表示使用鼠标,否则触摸屏

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Unity 无限滚动列表是一种常见的UI设计模式,用于在有大量数据的情况下,动态加载和显示列表项,以实现更好的性能和用户体验。 实现无限滚动列表需要以下步骤: 1. 创建一个包含UI元素(例如图标、文本块等)的列表项模板。 2. 创建一个容器对象,用于容纳列表项。这个容器对象可以是 ScrollView 或者使用 Unity 的 UI 布局组件。 3. 在启动时,初始化列表。通常会加载一部分列表项并显示在容器中,同时记录当前显示的第一个和最后一个列表项的索引。 4. 监听滚动事件。当滚动发生时,根据滚动的方向(向上或向下),动态地加载和显示新的列表项。 5. 当滚动到顶部时,加载并显示上一批新的列表项,并删除容器中最后一个列表项。 6. 当滚动到底部时,加载并显示下一批新的列表项,并删除容器中第一个列表项。 7. 重复第4至第6步,直到所有列表项都被加载和显示。 在实现无限滚动列表时,可以使用对象池来优化性能。对象池可以缓存已经创建的列表项对象,而不是每次滚动时都创建新的对象。这样可以避免频繁的对象创建和销毁,提高性能。 此外,还可以将无限滚动列表与数据源绑定,以便在滚动时动态从数据源中加载数据。这样可以实现更高效地处理大量数据的功能。 总而言之,Unity 无限滚动列表是一种非常有用的UI设计模式,可以在处理大量数据时提高性能和用户体验。通过合理的实现和优化,可以实现一个流畅且高效的无限滚动列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值