Unity3d C#实现基于UGUI ScrollRect的轮播图效果功能(含源码)

前言

轮播功能是一种常见的页面组件,用于在页面中显示多张图片/素材并自动或手动进行切换,以提高页面的美观度和用户体验。主要的功能是:自动/手动切换;平滑的切换效果;导航指示器等。可惜Unity的UGUI系统里没有现成的实现该功能,所以这里直接基于ScrollRect来实现该组件功能。在上述功能上新增了无限轮播、鼠标悬停暂停轮播、鼠标拖拽轮播、竖向轮播等功能。

硬广

自制3D版三维搭建俄罗斯方块WX小游戏,走过路过可以扫描支持。
在这里插入图片描述
三维的消除,地域难度:
在这里插入图片描述

效果

左右轮播:
在这里插入图片描述

上下轮播:
在这里插入图片描述

导航器轮播:
在这里插入图片描述

拖拽轮播:
在这里插入图片描述

实现

实现的思路是基于UGUI的ScrollRect组件用于滑动效果,而其中的HorizontalLayoutGroup
或者VerticalLayoutGroup对Content的内容进行排序,其实无限循环的轮播思路参考之前编写的
《Unity3d C# UGUI实现一个自动循环滚动的列表(ScrollRect)》 (https://blog.csdn.net/qq_33789001/article/details/120813324),平滑的切换效果是使用移动的动画效果(插件DOTweenPro),其余的核心就是轮播的时候对Content的位置进行计算和移动。以下是部分实现的过程。工程基于Unity3d 2020.3.28f1c1版本实现。

UI搭建

UI的整体搭建以常用的从右至左的轮播为基础,效果如下:
在这里插入图片描述

其中最外层为ScrollRect组件,Content上新增了Horizontal Layout Group用于子节点排序和Content Size Fitter用于宽度适配。详细设置如下:
在这里插入图片描述

其中需要特别注意的是padding left/right最好相等,Spacing也最好一致,如果设置不一致可能导致功能失效或者异常。
NodeTips下的节点是导航器的小图标,一个选中的图(Sel)和一个未选中的图(UnSel),并使用了Horizontal Layout Group进行了排序:
在这里插入图片描述

配置参数

为了保持插件的灵活性和适用性,设定了很多配置参数:

    [Header("自动轮播方向")]public SwipeDir swipeDir = SwipeDir.RightToLeft;   [Header("启用自动轮播")]public bool enbaleAuto = true;[Header("启用拖拽")]public bool enbaleDrag = true;[Header("轮播阀值(超出多少个元素)")][Range(1, 20)]public int ItemNum = 1;[Header("自动轮播间隔")]public float swipeDura = 5f;[Header("轮播动画时间")]public float swipeTime = 0.5f;

这些暴露出来的参数,可以在Inspector窗口进行灵活配置:
在这里插入图片描述

事件处理

这里鼠标滑动的操作依托于ScrollRect组件,而鼠标进入取消轮播,鼠标移出恢复轮播,鼠标拖拽释放置中节点等操作都需要对事件进行处理,这里使用了EventTrigger来实现,监听了鼠标进入、移出、开始拖拽、结束拖拽等事件,监听代码如下:

        AddETEvent(et, EventTriggerType.PointerEnter, OnPointerIn);AddETEvent(et, EventTriggerType.PointerExit, OnPointerOut);AddETEvent(et, EventTriggerType.BeginDrag, OnBeginDrag);AddETEvent(et, EventTriggerType.EndDrag, OnEndDrag);private void AddETEvent(EventTrigger et, EventTriggerType ei, UnityAction<BaseEventData> ua){UnityAction<BaseEventData> action = ua;EventTrigger.Entry entry = new EventTrigger.Entry();entry.eventID = ei;entry.callback.AddListener(action);et.triggers.Add(entry);
}

轮播方向

虽然常用的轮播是从右至左的操作,不过偶尔还是会有从左至右和上下轮播的需求情况,这里一共定义了四个方向:

public enum SwipeDir
{BottomToTop = 1,TopToBottom = 2,LeftToRight = 3,RightToLeft = 4
}

导航器

导航器是轮播器下方的提示小图标按钮,在轮播的节点出现后,需要初始化一下导航器,导航器会根据轮播的节点进行生成排序:

    void refreshTipsState() {for (int j = 0; j < tipList.Count; j++){tipList[j].gameObject.SetActive(tipList[j].refItem ? tipList[j].refItem.gameObject.activeSelf:false);if (nowCenterNode == tipList[j].refItem)tipList[j].Selected();elsetipList[j].Unselected();}
}

导航器初始化完成后,在鼠标点击后,导航器会根据轮播结果刷新导航器,当自动轮播开始时,也会刷新导航器:

    void refreshTipsState() {for (int j = 0; j < tipList.Count; j++){tipList[j].gameObject.SetActive(tipList[j].refItem ? tipList[j].refItem.gameObject.activeSelf:false);if (nowCenterNode == tipList[j].refItem)tipList[j].Selected();elsetipList[j].Unselected();}}

轮播功能

在自动轮播的过程中,到轮播时间时,会执行轮播过程;或者当手动拖拽轮播图时,拖拽结束后,也会执行轮播过程。轮播的过程就是将滚动内容移动至中心节点居中的位置,所以整个过程都是围绕获取中心节点,计算节点居中位置和移动到目标位置来实现的:

//执行轮播的动作
void doMoveToCenterNode(Transform tran)
{refreshTipsState();nowCenterNode = tran;int idx = getNodeActiveIndex(tran); // tran.GetSiblingIndex();if (idx < 0 || idx >= hvLayoutGroup.transform.childCount)return;Vector3 tPos;switch (swipeDir){case SwipeDir.BottomToTop:tPos = new Vector3(initPos.x, hvLayoutGroup.padding.top + (Space + itemHeight) * (idx + 1) - scrolltran.rect.height , initPos.z);break;case SwipeDir.TopToBottom:tPos = new Vector3(initPos.x, hvLayoutGroup.padding.top + (Space + itemHeight) * (idx + 1) - scrolltran.rect.height, initPos.z);break;case SwipeDir.LeftToRight:tPos = new Vector3(scrolltran.rect.width - hvLayoutGroup.padding.left - (Space + itemWidth) * (idx + 1), initPos.y, initPos.z);//new Vector3(LayoutGroup.padding.right + (Space + itemWidth) * (idx + 1) - scrolltran.rect.width, initPos.y, initPos.z);break;case SwipeDir.RightToLeft:tPos = new Vector3(scrolltran.rect.width - hvLayoutGroup.padding.left - (Space + itemWidth) * (idx + 1), initPos.y, initPos.z);break;default:tPos = new Vector3(scrolltran.rect.width - hvLayoutGroup.padding.left - (Space + itemWidth) * (idx + 1), initPos.y, initPos.z);break;}scrollrect.content.DOKill();scrollrect.content.DOAnchorPos3D(tPos, swipeTime);
}

这里的tPos就是移动的目标位置,计算这个数值和轮播方向有关,更和Content的RectTransform设定有关,结合HorizontalLayoutGroup的padding 和spacing设定进行计算。

工程源码

包含Unity3d 工程源码 以及unitypackage包。
https://download.csdn.net/download/qq_33789001/89507901

连接打不开说明审核未通过,稍后重试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第五次作业(多表联合查询)

新增员工表emp和部门表dept create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,财务), (102,销售…

初识C++【命名空间】【输入输出】【缺省参数】【函数重载】

前言 C是一种通用的编程语言&#xff0c;被广泛用于开发各种应用程序&#xff0c;包括系统软件、游戏、手机应用和高性能计算等。它是C语言的扩展&#xff0c;添加了许多新特性和功能&#xff0c;并支持面向对象编程。C可以在不同的平台上编译和运行&#xff0c;具有高效性、可…

开放式耳机哪个品牌比较好?2024最值得推荐的火爆机型!!

在这个快节奏的时代&#xff0c;我们都在寻找那些既能让我们享受音乐&#xff0c;又能保持对外界感知的音频设备。开放式耳机以其独特的设计&#xff0c;满足了这一需求&#xff0c;它们让你在享受音乐的同时&#xff0c;还能听到周围环境的声音&#xff0c;无论是安全出行还是…

华为、H3C、锐捷、思科四大设备厂商交换机配置命令总结合辑

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 一直以来&#xff0c;对于华为、H3C、锐捷、思科交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;四…

谱瑞科技高速传输接口芯片选型应用

谱瑞科技股份有限公司为一专供多种普及显示器以及个人计算机、消费性电子产品与显示面板所使用之高速讯号传输接口标准之混和信号 IC 芯片之领导供货商。谱瑞公司成立于 2005 年为一无自有晶圆厂之半导体公司&#xff0c;并于 2011 年股票在台湾柜台买卖中心正式挂牌交易(股票代…

Greenplum(三)【分布式事务和两阶段提交协议】

1、事务实现原理和 WAL&#xff08;单机&#xff09; 属性含义数据库系统实现Atomic&#xff08;原子性&#xff09;事务中的操作要么全部正确执行&#xff0c;要么完全不执行&#xff08;要么成功、要么失败&#xff09;Write Ahead Logging 预写日志&#xff0c;分布式事务&…

【删库跑路】一次删除pip下载的所有第三方库方法

进入命令行&#xff0c;先list看下库存 pip list导出所有的第三方库至一文件列表 pip freeze >requirements.txt按照列表卸载所有库 pip uninstall -r requirements.txt -y再list看下&#xff0c;可见库存已清空

1、课程导学(react+区块链实战)

1、课程导学&#xff08;react区块链实战&#xff09; 1&#xff0c;课程概述&#xff08;1&#xff09;课程安排&#xff08;2&#xff09;学习前提&#xff08;3&#xff09;讲授方式&#xff08;4&#xff09;课程收获 2&#xff0c;ibloackchain&#xff08;1&#xff09;安…

java:字符缓冲流特有功能

BufferedWriter&#xff1a; void newLine&#xff08;&#xff09;&#xff1a;写一行行分隔符&#xff0c;行分隔符字符串由系统属性定义 BufferedReader&#xff1a; public String readLine&#xff08;&#xff09;&#xff1a;读一行文字&#xff0c;结果包含行的内容的字…

AI赋能OFFICE 智能化办公利器!

ONLYOFFICE在线编辑器的最新版本8.1已经发布&#xff0c;整个套件带来了30多个新功能和432个bug修复。这个文档编辑器无疑成为了办公软件中的翘楚。它不仅支持处理文本文档、电子表格、演示文稿、可填写的表单和PDF&#xff0c;还允许多人在线协作&#xff0c;并支持AI集成&…

哪些独立站外链策略最有效?

在当前的SEO领域中&#xff0c;独立站外链策略的效果差异很大&#xff0c;但GPB外链无疑是其中最为有效的一种。GPB外链&#xff0c;指的是通过高质量、包收录且dofollow的顶级域名独立站来获得外链&#xff0c;这种外链策略能够显著提升目标网站的整体排名数据。 关键词排名的…

redis学习(007 实战:黑马点评:登录)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第25p-第p34的内容 文章目录 短信登录功能session 共享问题 短信登录功能 接口编写 这里是Result的封装 过滤器在拦截器的外层…

嵌入式系统中的实时操作系统任务调度策略

嵌入式系统中的实时操作系统任务调度策略 在嵌入式系统中&#xff0c;实时任务调度是确保系统响应性和稳定性的关键方面之一。不同的任务调度策略可以影响系统的性能和实时性。本文将深入探讨两种常见的实时任务调度策略&#xff1a;固定优先级调度和循环时间片调度&#xff0…

mysql查询语句执行流程

流程图 连接器&#xff1a;建立连接&#xff0c;管理连接、校验用户身份&#xff1b;查询缓存&#xff1a;查询语句如果命中查询缓存则直接返回&#xff0c;否则继续往下执行。MySQL 8.0 已删除该模块&#xff1b;解析 SQL&#xff0c;通过解析器对 SQL 查询语句进行词法分析、…

阿尔泰科技与西安交通大学陕西省某技术重点实验室共谋未来!

近日&#xff0c;阿尔泰科技的电子工程师&#xff08;熊工&#xff09;应邀前往西安交通大学陕西省某技术重点实验室&#xff0c;参与课题组项目的测试与调试工作。此次合作不仅成功推动了项目的进展&#xff0c;还为未来的深入合作奠定了坚实基础。 阿尔泰科技作为领先的测控技…

基于SpringBoot构造超简易QQ邮件服务发送(分离-图解-新手)

目录 获取QQ 授权码 SpringBoot构建 依赖 Yaml配置 服务编写 测试 获取QQ 授权码 https://mail.qq.com/ 接着后就会有对应的密钥了 SpringBoot构建 依赖 这里的建议是 2.0系列的Springboot版本用低一点的邮件依赖 <!-- 电子邮件 --> <dependency>&…

物联网实战:STM32+ESP8266温湿度数据采集上传Linux服务器与数据库可视化(附代码示例)

摘要: 本文将手把手教你搭建一个完整的物联网数据监控平台&#xff0c;使用STM32采集温湿度数据&#xff0c;通过ESP8266 WiFi模块上传至Linux服务器&#xff0c;并利用Python脚本将数据存储到MySQL数据库&#xff0c;最后实现每日平均值的计算和可视化展示。 关键词: STM32, …

抖音本地生活火爆!普通人如何申请抖音本地生活服务商?

当前&#xff0c;随着抖音外卖的正式开放&#xff0c;抖音本地生活的热度也迎来了新的高潮&#xff0c;与抖音本地生活服务商怎么申请等话题相关的词条更是成为了多个创业者社群的热搜榜单的常客。 事实上&#xff0c;就抖音本地生活服务商怎么申请等问题本身而言&#xff0c;…

nvm安装报错(镜像问题)

一、问题报错 安装的时候如果跟着网上早些时候的配置&#xff0c;调整了setting文件&#xff0c;配置镜像的话&#xff0c;可能报这个错误。 这个是因为他没检索到后面的链接地址&#xff0c;因为镜像的地址新的已经更换了。使用这个吧&#xff1a; node_mirror: https://npm…

java基础01—根据源码分析128陷阱以及如何避免128陷阱

源码分析128陷阱 如上图所示&#xff0c;int类型数据超过127依旧能正常比较&#xff0c;但Integer类型就无法正确比较了 /*** Cache to support the object identity semantics of autoboxing for values between* -128 and 127 (inclusive) as required by JLS.** The cache …