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();
            else
                tipList[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();
            else
                tipList[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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BiTCN-Attention一键实现回归预测+8张图+特征可视化图!注意力全家桶再更新!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 数据介绍 结果展示 全家桶代码目…

pom.xml文件加载后没有变成maven图标

原因&#xff1a; 开启了IDEA的节电模式 现象为&#xff1a; xml会变橙色&#xff0c;yml变粉色&#xff0c;自动提示关闭等 把这个节能模式的勾选给取消掉就可以正常显示了

flask的基本使用

1 sqlalchemy 快速使用 # 1 sqlalchemy 企业级orm框架# 2 python界的orm框架-1 django-orm #只能django框架用-2 peewee # 小型orm框架&#xff1a;https://docs.peewee-orm.com/en/latest/peewee/quickstart.html-----同步orm框架------3 sqlalchemy # 企业级…

虚拟机交叉编译基于ARM平台的opencv(ffmpeg/x264)

背景&#xff1a; 由于手上有一块rk3568的开发板&#xff0c;需要运行yolov5跑深度学习模型&#xff0c;但是原有的opencv不能对x264格式的视频进行解码&#xff0c;这里就需要将ffmpegx264编译进opencv。 但是开发板算力有限&#xff0c;所以这里采用在windows下&#xff0c;安…

React Native V0.74 — 稳定版已发布

嗨,React Native开发者们, React Native 世界中令人兴奋的消息是,V0.74刚刚在几天前发布,有超过 1600 次提交。亮点如下: Yoga 3.0New Architecture: Bridgeless by DefaultNew Architecture: Batched onLayout UpdatesYarn 3 for New Projects让我们深入了解每一个新亮点…

k8s 中间件

1. zookeeper 是的&#xff0c;Zookeeper 和 Kafka 经常一起使用&#xff0c;Zookeeper 在 Kafka 中扮演了关键角色。以下是 Zookeeper 和 Kafka 在实际项目中的结合使用及其作用的详细说明。 项目背景 假设我们有一个分布式数据处理系统&#xff0c;该系统需要高吞吐量的实…

300关卡成语释义典故题库ACCESS\EXCEL数据库

成语典故指关于成语产生、形成、流传的故事传说。成语有很大一部分是从古代相承沿用下来的&#xff0c;它既代表了一个故事典故&#xff0c;又是一种现成的话&#xff0c;很多又有比喻引申意义而被广泛引用。 今天又获得了一个成语游戏的数据&#xff0c;即根据成语典故或者释…

vue+element-ui简洁完美实现个人博客“​响石潭 ​”

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.生活 ​编辑 4.文章详情 ​编辑 5.关于我 ​编辑 ​编辑 三、源码实现 1.项目依赖package.json 2.项目启动 3.首页源码 四、总结 一、项目介绍 本项目在线预览&#xff1a;点击访问 参考官网&#xff1…

基于SpringBoot前后端分离旅游出行管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

vue3长列表优化,使用vue-virtual-scroller实现直播间弹幕列表虚拟滚动效果

使用的组件库是&#xff1a;https://github.com/Akryum/vue-virtual-scroller 官方文档&#xff1a;vue-virtual-scroller 安装依赖 npm install --save vue-virtual-scrollernextpnpm install --save vue-virtual-scrollernextyarn add vue-virtual-scrollernext 组件导入…

实战whisper第三天:fast whisper 语音识别服务器部署,可远程访问,可商业化部署(全部代码和详细部署步骤)

Fast Whisper 是对 OpenAI 的 Whisper 模型的一个优化版本,它旨在提高音频转录和语音识别任务的速度和效率。Whisper 是一种强大的多语言和多任务语音模型,可以用于语音识别、语音翻译和语音分类等任务。 Fast Whisper 的原理 Fast Whisper 是在原始 Whisper 模型的基础上进…

如何在《课外语文》期刊上发表论文?

如何在《课外语文》期刊上发表论文&#xff1f; 《课外语文》知网 G刊 月刊 3版3300字符 25年2-3月 &#xff08;栏目设置&#xff1a;学生作文&#xff1b;思辨阅读&#xff1b;课外读物&#xff1b;美文欣赏&#xff1b;整本书阅读&#xff1b;名师指路&#xff0c;趣味汉…

【经典算法题】两数之和

暴力解法 两层for循环&#xff0c;O(n*n) 优化解法 哈希&#xff0c;O(n) class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> hashtable new HashMap<Integer, Integer>();for (int i 0; i < nums.length; i) {if (ha…

工程安全监测仪器:振弦采集仪的应用与发展

工程安全监测仪器&#xff1a;振弦采集仪的应用与发展 振弦采集仪是一种常见的工程安全监测仪器&#xff0c;广泛应用于建筑、桥梁、隧道、地铁等工程项目中。它通过监测振弦的振动变化&#xff0c;可以及时发现结构变形或损坏情况&#xff0c;为工程的安全运行提供重要数据支…

0 TMS320F28379D 开坑

开坑原因 最近开始做实验&#xff0c;实验室的主控采用的是F2812FPGA&#xff0c;属于够用但不好用的状态。FPGA用于生成调制信号&#xff0c;DSP完成采样和控制。师兄师姐研究拓扑及调制策略&#xff0c;对驱动数量以及驱动逻辑有比较高的要求&#xff0c;因此不好脱离FPGA&a…

如何避免Java资源的过度配置

作为开发人员&#xff0c;我们经常会陷入两难的局面&#xff1a;我们既希望在应用中使用闪亮的新工具或代码库&#xff0c;又忌惮在部署到生产环境之后可能出现的未知问题。毕竟&#xff0c;没有人希望自己的手机老是在半夜叮咚作响&#xff0c;更不用说来自为了保持应用能够以…

增加Github访问稳定性

使用 steamcommunity_302软件 官方下载和使用地址&#xff1a; https://www.dogfight360.com/blog/686/#google_vignette

2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互

2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互 1 界面效果 在设定模式下&#xff0c;可以进行ROI 框的拖动&#xff0c;这里以Rect1举例说明 2 增加ROI类定义 /// <summary> /// ROI_single /// 用于描述图片感兴趣区域 /// type: 0:Rect1;1:Rect2;2:Circle ;3:…

SQL Server数据库的组成

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 对于数据库的概念&#xff0c;没有一个完全固定的定义&#xff0c;随着数据库历史的发展&#xff0c;定义的内容也有很大的差异&#xff0c;其中一种比较普遍的观点认为&#xff0c;…

Java - 程序员面试笔记记录 实现 - Part1

社招又来学习 Java 啦&#xff0c;这次选了何昊老师的程序员面试笔记作为主要资料&#xff0c;记录一下一些学习过程。 1.1 Java 程序初始化 Java 程序初始化遵循规则&#xff1a;静态变量优于动态变量&#xff1b;父类优于子类&#xff1b;成员变量的定义顺序&#xff1b; …