当前位置: 首页 > news >正文

Unity使用UGUI制作无限滑动列表

原理参照上一篇使用NGUI的制作无限滑动列表的文章

Unity 使用NGUI制作无限滑动列表_unity 滑动列表很多物体-CSDN博客

准备工作:

新建一个空物体命名为LoopList,并调整其大小,

并增加Scroll Rect组件(用于滑动)、Rect2D组件(用于裁剪)

新建一个空物体,命名Content,增加布局组件和自适应组件,再将Content的轴点y轴的值设置为1,这样可以让子物体的第一项从列表的顶部的开始排列。

新建一个脚本,命名为LoopScrollList4UGUI,将其挂载到LoopList物体上。

实现:

首先还是来观察Content及其子物体的情况,

从上可以看到,Content的UI坐标的y轴在变化,子物体的局部坐标不变化,因此可以将Content的位置变化作为参考,在Content上移超出一定位置时,将第一个放到最后一个,下移超出一定位置时,将最后一个放到第一个。

怎样操作?

Content的UI坐标位置是从0开始增加的,也就是说上移在ContentUI坐标y轴值大于一个子物体的宽度,下移在小于0,即可进行头部和尾部的子物体的位置变化。

代码如下:


        float currentY = content.anchoredPosition.y;
        // 上移超出一个位置时的处理
        // 向上滚动
        if (currentY > itemHeight)
        {
            Transform firstItem = content.GetChild(0);
            firstItem.SetAsLastSibling();
            content.anchoredPosition = new Vector2(content.anchoredPosition.x, content.anchoredPosition.y - itemHeight);
        }
        // 下移低于一个位置时的处理
        else if (currentY < 0)
        {
            Transform lastItem = content.GetChild(content.childCount - 1);
            lastItem.SetAsFirstSibling();
            content.anchoredPosition = new Vector2(content.anchoredPosition.x, content.anchoredPosition.y + itemHeight);
        }

在什么时候计算?

滑动列表的时候,Scroll Rect的onValueChanged会执行,因此只要在监听这个函数的执行时,就可以计算上述的头尾子物体位置变化。

   // 监听滚动事件
   scrollRect.onValueChanged.AddListener(OnScroll);
   // 滚动事件处理函数
   void OnScroll(Vector2 scrollPosition)
   {
       float currentY = content.anchoredPosition.y;

       // 上移超出一个位置时的处理
       // 向上滚动
       if (currentY > itemHeight)
       {
           Transform firstItem = content.GetChild(0);
           firstItem.SetAsLastSibling();
           content.anchoredPosition = new Vector2(content.anchoredPosition.x, content.anchoredPosition.y - itemHeight);
       }
       // 下移低于一个位置时的处理
       else if (currentY < 0)
       {
           Transform lastItem = content.GetChild(content.childCount - 1);
           lastItem.SetAsFirstSibling();
           content.anchoredPosition = new Vector2(content.anchoredPosition.x, content.anchoredPosition.y + itemHeight);
       }
   }

结果:

http://www.dtcms.com/a/62286.html

相关文章:

  • BambuStudio学习笔记:Model
  • postgresql 15.2 用pgbackup搭建备库后,主从复制一直无法启动
  • 从0到1入门Docker
  • word毕业论文“et al.”替换为“等”——宏
  • 爱迪斯通科技携手北京晨光溢海参展2025年北京教育装备展
  • MySQL:MySQL库和表的基本操作
  • Vue Amazing UI插件推荐
  • 【二分算法】-- x的平⽅根(easy)
  • @ComponentScan和@SpringBootApplication的scanBasePackages 同时使用
  • 面试模拟舱Pro:AI赋能的求职训练革命
  • DICOM Query/Retrieve(QR)详解与实现
  • 【Java】反射与动态代理篇
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_03可调整列宽的固定表头表格
  • 机器学习与深度学习算法及工具在图像分类中的应用总结
  • 移动Android和IOS自动化中常见问题
  • NPM安装与配置全流程详解(2025最新版)
  • Nginx的流式响应配置详解
  • 【每日学点HarmonyOS Next知识】状态变量、动画UI残留、Tab控件显示、ob前缀问题、文字背景拉伸
  • 【网络编程】HTTP网络编程
  • 前后端+数据库的项目实战--学生信息管理系统-易
  • Cesium 入门教程(基于 vue3)
  • Linux学习(十五)(故障排除(ICMP,Ping,Traceroute,网络统计,数据包分析))
  • 如何查看redis的缓存时间
  • js 使用 Web Workers 来实现一个精确的倒计时,即使ios手机锁屏或页面进入后台,倒计时也不会暂停。
  • 每天一篇《目标检测》文献(二)
  • Java线程详解
  • 【Linux】线程控制
  • 第四章:深入理解框架之 GUI 模块
  • ARM64异常处理技术
  • 我与红队:一场网络安全实战的较量与成长