Unity 自动轮播、滑动轮播

如图所示,可设置轮播间隔,可左右滑动进行轮播

1.在UGUI创建个Image,添加自动水平组件

 2.添加并配置脚本

3.代码如下,都有注释

using UnityEngine;
using UnityEngine.UI;

public class IndicatorManager : MonoBehaviour
{
    public GameObject indicatorPrefab; // 轮播物体的预制体
    public Transform indicatorParent; // 轮播物体的父级对象
    private int pageCount = 5; // 页面数量

    private GameObject[] indicatorsArray; // 存储所有轮播物体的数组
    private int currentPage = 0; // 当前页面索引
    private Vector2 slideStartPosition; // 记录滑动的起始点
    private bool isSliding = false; // 标志是否正在执行滑动操作

    private bool isAutoSlidingPaused = false; // 标志是否暂停自动轮播
    private float autoSlideInterval = 3f; // 自动轮播间隔时间
    private float autoSlideTimer = 0f; // 计时器,用于自动轮播


    private void Start()
    {
        CreateIndicators();
        UpdateIndicators();
    }

    private void Update()
    {
        // 更新计时器
        UpdateTimer();

        // 检测左右滑动手势
        DetectSwipe();
    }

    // 创建页面指示器
    private void CreateIndicators()
    {
        indicatorsArray = new GameObject[pageCount];

        for (int i = 0; i < pageCount; i++)
        {
            GameObject indicator = Instantiate(indicatorPrefab, indicatorParent);
            indicatorsArray[i] = indicator;
        }
    }


    // 设置当前页面,并更新页面指示器
    private void SetCurrentPage(int pageIndex)
    {
        currentPage = Mathf.Clamp(pageIndex, 0, pageCount - 1);
        UpdateIndicators();
    }


    // 更新页面指示器的显示状态
    private void UpdateIndicators()
    {
        for (int i = 0; i < pageCount; i++)
        {
            // 将当前页面的轮播物体颜色设置为白色,其他页面的轮播物体颜色设置为灰色
            indicatorsArray[i].GetComponent<Image>().color = (i == currentPage) ? Color.white : new Color(0.5f, 0.5f, 0.5f, 0.5f);
        }
    }


    // 自动轮播方法
    private void AutoSlide()
    {
        // 如果没有正在执行滑动操作且未暂停自动轮播,则切换到下一个页面
        if (!isSliding && !isAutoSlidingPaused)
        {
            SetCurrentPage((currentPage + 1) % pageCount);
        }
    }

    // 检测左右滑动手势
    private void DetectSwipe()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // 记录滑动的起始点
            if (IsInsideParent(Input.mousePosition))
            {
                slideStartPosition = Input.mousePosition;
            }
        }
        else if (Input.GetMouseButton(0))
        {
            float deltaX = Input.mousePosition.x - slideStartPosition.x;

            // 如果没有正在执行滑动操作且滑动距离足够大,则切换页面
            if (!isSliding && !isAutoSlidingPaused && Mathf.Abs(deltaX) > 50f && IsInsideParent(Input.mousePosition))
            {
                int direction = (deltaX > 0) ? -1 : 1;
                SetCurrentPage((currentPage + direction + pageCount) % pageCount);

                // 标志为正在执行滑动操作
                isSliding = true;

                // 暂停自动轮播
                PauseAutoSlide();
            }
        }
        else if (Input.GetMouseButtonUp(0))
        {
            // 重置滑动标志
            isSliding = false;

            // 恢复自动轮播
            ResumeAutoSlide();
        }
    }

    // 判断坐标是否在父物体内
    private bool IsInsideParent(Vector2 position)
    {
        RectTransform parentRect = indicatorParent.GetComponent<RectTransform>();
        return RectTransformUtility.RectangleContainsScreenPoint(parentRect, position);
    }


    // 更新计时器
    private void UpdateTimer()
    {
        // 如果没有正在执行滑动操作且未暂停自动轮播,则更新计时器
        if (!isSliding && !isAutoSlidingPaused)
        {
            autoSlideTimer += Time.deltaTime;

            // 如果计时器超过轮播间隔时间,则执行自动轮播
            if (autoSlideTimer >= autoSlideInterval)
            {
                AutoSlide();

                // 重置计时器
                autoSlideTimer = 0f;
            }
        }
    }

    // 暂停自动轮播
    private void PauseAutoSlide()
    {
        isAutoSlidingPaused = true;
    }

    // 恢复自动轮播,并重置计时器
    private void ResumeAutoSlide()
    {
        isAutoSlidingPaused = false;
        autoSlideTimer = 0f;
    }
}

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

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

相关文章

【IM】如何保证消息可用性(二)

请先阅读第一篇&#xff1a;【IM】如何保证消息可用性&#xff08;一&#xff09; 在第一篇文章中我们了解了保证消息可用性的挑战与目标&#xff0c;现在我们来对于具体的技术方案进行探讨。 1. 上行消息 消息上行过程指的是客户端发送消息给服务端 我们需要先辨析几个概念…

mybatis代码生成器配置pojo不生成Example类,且去掉表名前缀t_

待生成的表 mybatis-generator-config.xml的table属性配置如下时生成的pojo和mapper <table tableName"%"></table>正常想要的是去掉T且去掉Example类 <table tableName"%"enableCountByExample"false" enableUpdateByExample&…

初识C语言·文件操作

目录 1 关于文件 i)文件的基本知识 ii)数据文件的分类 2 文件打开和关闭 i)流和标准流 ii)文件指针 iii)文件打开和关闭 3 文件的顺序读写 i) fgetc fputc ii) fgets fputs iii) fscanf fprintf iv) fwrite fread 4 对比一组函数 scanf/fscanf/sscanf/printf/fpri…

(十)springboot实战——springboot3下的webflux项目mysql数据库事务处理

前言 WebFlux 是 Spring Framework 5.0 中引入的一种新型反应式编程模型&#xff0c;支持非阻塞 I/O&#xff0c;适用于高并发、高吞吐量的应用程序。在 WebFlux 应用程序中使用事务需要注意以下几点。使用 Reactive R2DBC&#xff1a;WebFlux 支持使用 Reactive R2DBC 访问关…

前端大厂面试题探索编辑部——第四期

目录 题目 单选题 题解 JavaScript的异步编程 Promise 异步函数async/await 关于Ajax 题目 这期只有一道题&#xff0c;我们来详细讲讲JavaScript的异步编程&#xff0c;当然&#xff0c;异步编程是许多编程语言都有的一种编程思想&#xff0c;我们在前端这个领域&#…

Python爬虫:XPath基本语法

XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位元素的语言。它使用路径表达式来选择节点或节点集&#xff0c;类似于文件系统中的路径表达式。 不啰嗦&#xff0c;讲究使用&#xff0c;直接上案例。 导入 pip3 install lxmlfrom lxml import etr…

springboot中获取配置文件中属性值的几种方式

目录 第一章、使用Value注解第二章、使用PropertySource注解第三章、使用Configurationproperties注解第四章、使用Java Properties类第五章、使用Environment接口 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置…

旋转花键磨损后如何修复?

旋转花键是机械传动中的一种&#xff0c;传递机械扭矩的&#xff0c;在轴的外表有纵向的键槽&#xff0c;套在轴上的旋转件也有对应的键槽&#xff0c;可保持跟轴同步旋转。在旋转的同时&#xff0c;有的还可以在轴上作纵向滑动&#xff0c;如变速箱换档齿轮等。 我们在使用某些…

VirtualBox安装Ubuntu22.04

目录 1、新建虚拟机 1.1、设置内存大小 1.2、创建虚拟硬盘 2、虚拟机设置 2.1、设置启动顺序​编辑 2.2、选择iso镜像文件 2.3、设置网络(桥接网卡) 3、启动 3.1、设置语言环境 3.2、系统更新安装(不更新) 3.3、选择键盘布局(默认即可) 3.4、选择安装类型 3.5、网…

项目实战:一个基于标准库的具备最值获取的万能容器实现

目录 写在前面 需求 分析 接口设计 项目实现 一些思考与总结 致谢 写在前面 刚刚介绍了变参模板和完美转发&#xff0c;现在换一换脑子做一个小的项目实战吧。博主最近学习的是标准库&#xff0c;总体来说&#xff0c;我认为标准库中的内容是很trivial的&#xff0c;重点…

STM32实时时钟(RTC)的配置和使用方法详解

实时时钟&#xff08;RTC&#xff09;是STM32系列微控制器上的一个重要模块&#xff0c;用于提供准确的时间和日期信息。在本文中&#xff0c;我们将详细介绍STM32实时时钟的配置和使用方法。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢…

【C++】默认成员函数

与普通成员函数差距较大&#xff0c;形式对于我们比较陌生&#xff0c;但这是语法&#xff0c;是我们是必须要掌握的。 目录 类的默认成员函数&#xff1a;构造函数&#xff1a;概念&#xff1a;语法&#xff1a;特性&#xff1a; 析构函数&#xff1a;概念&#xff1a;语法&a…

Django模型(七)

一、聚合与分组查询 1.1、准备数据 class Cook(models.Model):"""厨师"""name = models.CharField(max_length=32,verbose_name=厨师名)level = models.IntegerField(verbose_name=厨艺等级)age = models.IntegerField(verbose_name=年龄)sect …

消息中间件之RocketMQ源码分析(三)

RocketMQ中的Consumer启动流程 RocketMQ客户端中有两个独立的消费者实现类分别为DefaultMQPullConsumer和DefaultMQPushConsumer&#xff0c; DefaultMQPullConsumer DefaultMQPullConsumer,该消费者使用时需要用户主动从Broker中Pull消息和消费消息&#xff0c;提交消费位点…

Springboot-SpringCloud学习

文章目录 web项目开发历史 SpringBootSpring以及Springboot是什么微服务第一个Springboot项目配置如何编写 yaml自动装配原理集成 web开发&#xff08;业务核心&#xff09;集成 数据库 Druid分布式开发&#xff1a;Dubbo&#xff08;RPC&#xff09; zookeeperswagger&#x…

掌握使用 React 和 Ant Design 的个人博客艺术之美

文章目录 前言在React的海洋中起航安装 Create React App安装Ant Design 打造个性化的博客风格通过路由实现多页面美化与样式定制部署与分享总结 前言 在当今数字时代&#xff0c;个人博客成为表达观点、分享经验和展示技能的独特平台。在这个互联网浪潮中&#xff0c;选择使用…

新火种AI|脑洞照进现实!马斯克正式官宣,已将芯片连入大脑...

作者&#xff1a;小岩 编辑&#xff1a;彩云 2024年1月30日&#xff0c;马斯克在社交媒体上宣布&#xff0c;他的公司Neuralink已经完成了首例人类大脑芯片植入手术&#xff0c;并且目前手术恢复状况良好。这一突破性进展意味着人类距离实现大脑与电脑的直接连接更近了一步。…

【mysql】InnoDB引擎的索引

目录 1、B树索引 1.1 二叉树 1.1.1 二分查找&#xff08;对半查找&#xff09; 1.1.2 树&#xff08;Tree&#xff09; 1.1.2.1 树的定义 1.1.2.2 树的特点 1.1.2.3 二叉树 1.1.2.4 二叉查找&#xff08;搜索&#xff09;树 1.2 B树 1.2.1 聚簇索引&#xff08;clust…

AI-数学-高中-14-函数零点存在定理和运用

原作者视频&#xff1a;【函数综合】【考点精华】1零点存在性定理的运用&#xff08;基础&#xff09;_哔哩哔哩_bilibili 1.定义&#xff1a; 2.零点存在定义&#xff1a; 2.函数零点与图像焦点的转化 零点如果不好求&#xff0c;将函数化成两个函数再画图&#xff0c;看函数…

防抖和节流?有什么区别?如何实现?

#一、是什么 本质上是优化高频率执行代码的一种手段 如&#xff1a;浏览器的 resize、scroll、keypress、mousemove 等事件在触发时&#xff0c;会不断地调用绑定在事件上的回调函数&#xff0c;极大地浪费资源&#xff0c;降低前端性能 为了优化体验&#xff0c;需要对这类…