Unity 自动轮播、滑动轮播

news2024/10/7 8:19:40

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

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;
    }
}

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

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

相关文章

鸿蒙不再兼容安卓,那么鸿蒙开发者是否会大增?

华为的纯血版鸿蒙已出现。紧接着各大厂商都纷纷加入原生应用开发当中&#xff0c;其中包括支付宝、京东、美团等一线大厂&#xff0c;200 多应用厂商正在加速开发鸿蒙原生应用。鸿蒙生态设备数量仅历时 5 个月即从 7 亿增长至 8 亿。 而鸿蒙的开发不止应用层&#xff0c;它是以…

6.3 内存池模式

Bruce Powel Douglass大师介绍-CSDN博客https://blog.csdn.net/ChatCoding/article/details/134665868嵌入式软件开发从小工到专家-CSDN博客https://blog.csdn.net/ChatCoding/article/details/135297955C嵌入式编程设计模式源码-CSDN博客https://blog.csdn.net/ChatCoding/art…

根文件系统之initramfs

问题抛出&#xff1a; 1.系统启动时文件系统功能的实现 1.bootloader支持 1.uboot启动 ——典型的arm设备的选择。 情景1&#xff1a;使用initrd或initramfs&#xff0c;内核和根文件系统作为不同镜像时&#xff0c;uboot负责提供启动参数&#xff1b;加载根文件系统到内存…

C++ 设计模式之解释器模式

【声明】本题目来源于卡码网&#xff08;卡码网KamaCoder&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 --什么是解释器模式&#xff08;第22种设计模式&#xff09; 解释器模式&#xff08;Interpreter…

【INTEL(ALTERA)】带有浮点单元 (FPU) Nios® V/g 处理器在 英特尔® Cyclone10 GX 设备中执行不正确的浮点运算

说明 由于 英特尔 Quartus Prime Pro Edition 软件版本 23.3 存在一个问题&#xff0c;当使用 Nios V/g 处理器并在 英特尔 Cyclone 10 GX 设备中启用 FPU 时&#xff0c;浮点运算无法按预期进行。 Nios V/g 处理器 – 启用浮点单元 解决方法 请勿在 英特尔 CycloneNios 10 G…

张维迎《博弈与社会》笔记(2)导论:个体理性与社会最优:协调与合作问题

有节选&#xff0c;相当于按照自己的方式将内容组织了下吧&#xff1f; 协调与合作问题 什么是一个社会面临的基本问题&#xff1f; 这似乎是一个我们每一个人都可以触摸得到但又难以说清的问题&#xff0c;因为在不同的语境下&#xff0c;“社会”一词的内涵有所差异。但其基…

火山引擎ByteHouse:分析型数据库如何设计并发控制?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 分析型数据库设计并发控制的主要原因是为了确保数据的完整性和一致性&#xff0c;同时提高数据库的吞吐量和响应速度。并发控制可以防止多个事务同时对同一数据进行…

ICMPv6报文解析及NAT处理

ICMPv6报文概述 参考RFC4443和RFC2460 ICMPv6报文是IPv6在internal control management protocol&#xff08;ICMP&#xff09;的基础之上做了一些改动&#xff0c;得到了ICMPv6协议&#xff0c;IPv6的next_header为58。 Message general format 每条ICMPv6消息之前都有一个…

从零开始的OpenGL光栅化渲染器构建6-PBR光照模型

前言 PBR&#xff0c;或者基于物理的渲染(Physically Based Rendering)&#xff0c;它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。正因为基于物理的渲染目的便是为了使用一种更符合物理学规律的方式来模拟光线&#xff0c;因此…

Mybatis 源码系列:领略设计模式在 Mybatis 其中的应用

文章目录 一、Builder模式二、工厂模式三、单例模式四、代理模式五、组合模式六、模板方式模式七、适配器模式八、装饰器模式九、迭代器模式 虽然我们都知道有23种设计模式&#xff0c;但是大多停留在概念层面&#xff0c;真实开发中很少遇到&#xff0c;Mybatis源码中使用了大…

代理IP技术在云函数中的创新应用与拓展空间

目录 前言 一、代理IP技术的基本概念和原理 二、云函数的基本原理和优势 1. 弹性伸缩 2. 省时省力 3. 按需计费 三、代理IP技术在云函数中的创新应用 1. 反爬虫技术 2. 访问安全性和隐私保护 3. 地理定位和访问控制 四、代理IP技术在云函数中的拓展空间 1. 代理IP池…

力扣hot100 跳跃游戏 贪心

Problem: 55. 跳跃游戏 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考 挨着跳&#xff0c;记录最远能到达的地方 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public boolean canJump(int[] nums)…

AI大模型专题:大模型安全与伦理研究报告2024

今天分享的是AI大模型系列深度研究报告&#xff1a;《AI大模型专题&#xff1a;大模型安全与伦理研究报告2024》。 &#xff08;报告出品方&#xff1a;腾讯研究院&#xff09; 报告共计&#xff1a;76页 大模型具有不同于传统模型的特点和优势 第一&#xff0c;大模型和传统…

页面通过Vue进行整体页面不同语言切换 i18n库

目录 引入 如何做到 下载i18n库 构建整体翻译文件结构 语言包文件 i18n配置文件 把i18n挂载到vue实例上 添加按钮点击事件切换语言 引入 我们现在有这样一个要求,我们想要对我们开发的网页进行国际化操作,也就是我们不仅要有中文,还要有英文等。用户可以随时进行不同语言…

langchain+xray:prompt控制漏洞扫描

写在前面 xray是长亭推出的一款漏洞扫描工具。 langchain是调用LLM大模型完成自动化任务的框架。 本篇文章是对langchain自定义工具的探索&#xff0c;通过编写一个xray调用的工具&#xff0c;联合ChatGPT对xray进行调用&#xff0c;实现对目标的漏洞扫描。 xray功能分析 …

洛谷-P4124题-手机号码-Java

题目 题目链接&#xff1a; https://www.luogu.com.cn/problem/P4124 分析 给定两个长度为11位的数字&#xff0c;代表两个区间 [L,R] 需要编写程序来计算出&#xff0c;这两个区间内满足要求的数字个数。这样的题一般来说就是数位dp题。首先我们可以根据容斥原理 [0,R]中满…

第一批 Apple Vision Pro 开箱和佩戴体验新鲜出炉!!!

注: 本文转自微信公众号 BravoAI (专注AI资讯和技术分享), 原文网址:第一批 Apple Vision Pro 开箱和佩戴体验新鲜出炉!!!, 扫码关注公众号 编者按: 整个AR/VR行业都在等AVP, 期待它能带来ChatGPT般的冲击 AVP(Apple Vision Pro) 是苹果公司研发的第一款"空间计算 (Spa…

跟着pink老师前端入门教程-day11

3、CSS 三角 网页中常见一些三角形&#xff0c;使用CSS直接画出来即可&#xff0c;不必做成图片或字体图标 4、CSS 用户界面样式 4.1 什么是界面样式 界面样式&#xff1a;更改一些用户操作样式&#xff0c;以便提高更好的用户体验&#xff08;更改用户的鼠标样式、表单轮廓…

Redis简单阐述、安装配置及远程访问

目录 一、Redis简介 1.什么是Redis 2.特点 3.优势 4.数据库对比 5.应用场景 二、 安装与配置 1.下载 2.上传解压 3.安装gcc 4.编译 5.查看安装目录 6.后端启动 7.测试 8.系统服务配置 三、Redis远程访问 1.修改访问IP地址 2.设置登录密码 3.重启Redis服务 …

《QDebug 2024年1月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Repeator 的 delegate 在 remove 移除时的注意事项 Qt Bug Tracker&#xff1a;https://bugreports.qt.io/browse/QTBUG-47500 Repeator 在调用 remove 函数之后&#xff0c;对应的 Item 会立即释放&#xff0c;后续就…