Unity UGUI ScrollView无限滚动效果

2024-04-19 23:38

本文主要是介绍Unity UGUI ScrollView无限滚动效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、发现需求

1、在UGUI中,使用 ScrollView + 表格布局和字段自适应组件 就可以很好的实现列表功能。

2、如果列表中同时存在很多个Item时,显示区域却只显示一部分,就会造成性能不必要的浪费。

3、这时就想到,利用对象池相关知识,只在列表显示的地方实例化有限的Item即可。


二、实现原理

在列表滑动时,根据Content移动的位置偏差,计算出当前需要显示的Item索引,配合对象池,动态刷新Item数据。


三、实现需求

1、新建一个ScrollView,给物体添加CircularScrollRect脚本,设置好参数。

2、然后在其他脚本在合适的时机调用 CircularScrollRect 的 Init()、ShowAndUpdateList()、ClearScrollRectAllItem()等方法即可。


最终效果:

在这里插入图片描述
使用【customeditor特性】给CircularScrollRect脚本写了一个编辑器拓展,方便调参.

在这里插入图片描述


部分代码:

    /// <summary>/// 滑动content,更新Item./// </summary>private void UpdateCheck(){if (m_ItemInfos == null) return;  //没有Item,不执行.//检查超出范围for (int i = 0, length = m_ItemInfos.Length; i < length; i++){ItemInfo itemInfo = m_ItemInfos[i];GameObject obj = itemInfo.obj;Vector3 pos = itemInfo.pos;float posXY = m_Direction == ScrollRect_Direction.Vertical ? pos.y : pos.x;if (IsOutRange(posXY)) //超出显示范围.{//把超出范围的item 扔进 poolsObj里.if (obj != null){EnterPoolsObj(obj);m_ItemInfos[i].obj = null;}}else    //在显示范围内.{//已在范围内的Item,不需要设置.if (obj == null)    {GameObject item = GetPoolsObj();    //优先从 poolsObj中 取出. (poolsObj为空则返回 实例化的item)item.transform.localPosition = pos;item.gameObject.name = m_ItemName + "_" + i.ToString();m_ItemInfos[i].obj = item;ImplementActionMethod(m_itemUpdateCallBack, item);}}}}
    /// <summary>/// 判断是否超出显示范围./// </summary>/// <param name="posXY">垂直为Y,水平为X</param>/// <returns></returns>private bool IsOutRange(float posXY){Vector3 contentPos = m_Content_RTrans.anchoredPosition;#region if Item中心点在左上角.if (m_ItemPivot == Item_Pivot.LeftUp)                   //Item中心点在左上角.{if (m_Direction == ScrollRect_Direction.Vertical)   //垂直方向.{if (posXY + contentPos.y > m_ItemObj_Height ||         //上方超出范围.posXY + contentPos.y < -m_RTrans.rect.height)      //下方超出范围.{return true;}}else    //水平方向.{ if (posXY + contentPos.x < -m_ItemObj_Width ||         //左方超出范围.posXY + contentPos.x > m_RTrans.rect.width)        //右方超出范围.{return true;}}return false;}#endregion#region else if Item中心点在中央.else if (m_ItemPivot == Item_Pivot.Center)  //Item中心点在中央.{if (m_Direction == ScrollRect_Direction.Vertical)   //垂直方向.{if (posXY + (m_ItemObj_Height / 2) + contentPos.y > m_ItemObj_Height ||        //上方超出范围.posXY + (m_ItemObj_Height / 2) + contentPos.y < -m_RTrans.rect.height)     //下方超出范围.{return true;}}else    //水平方向.{if (posXY + (m_ItemObj_Width / 2) + contentPos.x < -m_ItemObj_Width ||        //左方超出范围.posXY - (m_ItemObj_Width / 2) + contentPos.x > m_RTrans.rect.width)       //右方超出范围.{return true;}}return false;}#endregion#region else Item中心点在其他位置.else    //Item中心点在其他位置.Obsolete{return true;}#endregion}


Github,项目代码

这是以前写的代码,当时阅览过不小博客资源,若有雷同,侵删,完毕.

这篇关于Unity UGUI ScrollView无限滚动效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/918751

相关文章

html 滚动条滚动过快会留下边框线的解决方案

《html滚动条滚动过快会留下边框线的解决方案》:本文主要介绍了html滚动条滚动过快会留下边框线的解决方案,解决方法很简单,详细内容请阅读本文,希望能对你有所帮助... 滚动条滚动过快时,会留下边框线但其实大部分时候是这样的,没有多出边框线的滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java实现图片淡入淡出效果

《Java实现图片淡入淡出效果》在现代图形用户界面和游戏开发中,**图片淡入淡出(FadeIn/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

禁止HTML页面滚动的操作方法

《禁止HTML页面滚动的操作方法》:本文主要介绍了三种禁止HTML页面滚动的方法:通过CSS的overflow属性、使用JavaScript的滚动事件监听器以及使用CSS的position:fixed属性,每种方法都有其适用场景和优缺点,详细内容请阅读本文,希望能对你有所帮助... 在前端开发中,禁止htm