在Unity中实现分页数据显示和分页控制

参考:用两种简单的方式实现unity的分页效果

在这里插入图片描述
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Rendering.VirtualTexturing;
using UnityEngine.TerrainUtils;

public class PageController : MonoBehaviour
{
    private List<int> items;

    /// <summary>
    /// 总数据数量
    /// </summary>
    private int ItemsCount;

    /// <summary>
    /// 总页数,没有数据默认为1
    /// </summary>
    private int PageCount = 1;

    /// <summary>
    /// 当前页数的标签
    /// </summary>
    private Text PanelText;

    /// <summary>
    /// 当前页面索引
    /// </summary>
    private int PageIndex = 1;

    /// <summary>
    /// 上一页按钮
    /// </summary>
    private Button BtnPrevious;

    /// <summary>
    /// 下一页按钮
    /// </summary>
    private Button BtnNext;

    /// <summary>
    /// 父物体组件,所有的子物体全部挂在这个上
    /// </summary>
    public GameObject ParentObj;

    /// <summary>
    /// 需要使用的预制件,该游戏物体上会绑定各种事件、资源等,同时也是子物体
    /// </summary>
    public GameObject gameObjectPrefab;

    public bool pressBtnPrevious = false;
    public bool pressBtnNext = false;
    
	// 填充进UpdateUI<T>的数据
    List<int> dataList = new List<int> { 1, 2, 3, 4, 5 ,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};
    List<string> dataList2 = new List<string> { "a", "b", "c", "d", "e", 
                                                "a2", "b2", "c2", "d2", "e2", 
                                                "a3", "b3", "c3", "d3", "e3",
                                                 "a4", "b4", "c4", "d4", "e4" };



    void Start()
    {
        InitUGUI();
        Init(dataList2);
    }

    /// <summary>
    /// 初始化UGUI
    /// </summary>
    private void InitUGUI()
    {
        BtnNext = GameObject.Find("Canvas/BtnNext").GetComponent<Button>(); // 下一页按钮

        BtnPrevious = GameObject.Find("Canvas/BtnPrevious").GetComponent<Button>(); // 上一页按钮
        
        PanelText = GameObject.Find("Canvas/PanelText").GetComponent<Text>(); // 页码文本
        
        gameObjectPrefab = (GameObject)Resources.Load("Test/data"); // 预制体

        //为上一页按钮与下一页按钮添加事件
        BtnNext.onClick.AddListener(() => { Next(); });
        BtnPrevious.onClick.AddListener(() => { Previous(); });
    }

    /// <summary>
    /// 下一页事件
    /// </summary>
    private void Next()
    {
        pressBtnNext = true;
        //最后一页禁止翻页
        if (PageIndex == PageCount)
            return;

        if (PageIndex >= PageCount)
            PageIndex = PageCount;

        DestroyChildObject(ParentObj);  // 删除所有子对象
        //DestroyOneChildObj(ParentObj);  // 按BtnNext删除最左边的子对象
        PageIndex += 1;
        UpdateUI(PageIndex, dataList2);

        //更新页面页数
        PanelText.text = string.Format("{0}/{1}", PageIndex.ToString(), PageCount.ToString());

        pressBtnNext = false;
    }

    private void Previous()
    {
        pressBtnPrevious = true;

        //第一页禁止翻页
        if (PageIndex == 1)
            return;

        DestroyChildObject(ParentObj);  // 删除所有子对象
        //DestroyOneChildObj(ParentObj);  // 按BtnPrevious删除最右边的子对象

        PageIndex -= 1;

        UpdateUI(PageIndex, dataList2);

        //更新页面页数
        PanelText.text = string.Format("{0}/{1}", PageIndex.ToString(), PageCount.ToString());

        pressBtnPrevious = false;
    }

    /// <summary>
    /// 初始化元素
    /// </summary>
    private void Init<T>(List<T> datas)
    {
        //计算元素总个数        
        items = new List<int>();
        for (int i = 0; i < 20; i++)
        {
            var index = Random.Range(1, 4);
            items.Add(index);
        }
        ItemsCount = items.Count;

        //计算总页数
        PageCount = items.Count % 4 == 0 ? items.Count / 4 : items.Count / 4 + 1;
        if (items.Count <= 4)
            PageCount = 1;

        PageIndex = 1;
        //调用绑定页数方法
        //UpdateUI(PageIndex);
        //datas - >当前页码的_datas
        List<T>_datas = new List<T>();
        //UpdateUI(PageIndex, _datas);
        UpdateUI(PageIndex, dataList2);
        //更新界面页数
        PanelText.text = string.Format("{0}/{1}", PageIndex.ToString(), PageCount.ToString());
    }

    /// <summary>
    /// 绑定页数方法
    /// </summary>
    /// <param name="当前页码"></param>
    private void UpdateUI<T>(int currentIndex,List<T> data)
    {
        //没有数据则直接return
        if (ItemsCount <= 0)
        {
            return;
        }

        for (int i = (PageIndex - 1) * 4; i < ((PageIndex - 1) * 4 + 4 > ItemsCount ? ItemsCount : (PageIndex - 1) * 4 + 4); i++)
        {

            var needGameObject = Instantiate(gameObjectPrefab) as GameObject;
            needGameObject.transform.SetParent(ParentObj.transform);

            Text dataText = needGameObject.transform.Find("DataText").GetComponent<Text>();
            dataText.text = data[i].ToString();




            //needGameObject.GetComponent<Image>().sprite = LoadSprite(items[i].ToString());
        }
    }

    /// <summary>
    /// 删除对象下的子对象
    /// </summary>
    /// <param name="父物体"></param>
    public void DestroyChildObject(GameObject parentObject)
    {
        if (parentObject == null)
            return;
        for (int i = parentObject.transform.childCount - 1; i >= 0; i--)
        {
            Destroy(parentObject.transform.GetChild(i).gameObject);
        }
        Resources.UnloadUnusedAssets(); //释放未使用资源
    }

    /// <summary>
    /// 删除对象下的一个子对象(如果按BtnNext就是删除最左边的子对象,按BtnPrevious就是删除最右边的子对象)
    /// </summary>
    /// <param name="parentObject"></param>
    public void DestroyOneChildObj(GameObject parentObject)
    {
        if (parentObject == null)
            return;

        if(pressBtnNext)
        {
            Destroy(parentObject.transform.GetChild(0).gameObject);//删除最左边的子对象
        }else if(pressBtnPrevious)
        {
            Destroy(parentObject.transform.GetChild(parentObject.transform.childCount - 1).gameObject);//删除最右边的子对象
        }

        Resources.UnloadUnusedAssets(); //释放未使用资源
    }





    private Sprite LoadSprite(string assetName)
    {
        Texture texture = (Texture)Resources.Load("Textures/" + assetName);
        Sprite sprite = Sprite.Create((Texture2D)texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
        return sprite;
    }
}

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

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

相关文章

五一反向旅游,景区“AI+视频监控”将持续助力旅游业发展

一、建设背景 每年五一劳动节出去旅游都是人挤人状态&#xff0c;这导致景区的体验感极差。今年“五一反向旅游”的话题冲上了热搜&#xff0c;好多人选择了五一之后再出去旅游&#xff0c;避开拥挤的人群&#xff0c;这个时候景区的监管力度和感知能力就更要跟上去&#xff0…

Gradio之blocks灵活搭建页面

这里写目录标题 搭建一个UI界面搭建上半部分的框架比例调节以及其他效果搭建下半部分左边部分搭建下半部分右边部分拓展-CSS的应用 使用标签搭建第二个页面示例 补充AccordionGroup() 搭建一个UI界面 搭建上半部分的框架 如下图&#xff0c;我们想要基本还原下图右边的UI界面…

AI去衣技术在动画制作中的应用

随着科技的发展&#xff0c;人工智能&#xff08;AI&#xff09;已经在各个领域中发挥了重要作用&#xff0c;其中包括动画制作。在动画制作中&#xff0c;AI去衣技术是一个重要的工具&#xff0c;它可以帮助动画师们更加高效地完成工作。 AI去衣技术是一种基于人工智能的图像…

如何自己快速的制作流程图?6个软件教你快速进行流程图制作

如何自己快速的制作流程图&#xff1f;6个软件教你快速进行流程图制作 自己制作流程图可以是项目管理、流程设计或教学展示中的重要环节。以下是六款常用的流程图制作软件&#xff0c;它们都提供了快速、简单的方式来制作流程图&#xff1a; 迅捷画图&#xff1a;这是一款非…

Azide-PEG-Azide,82055-94-5可以用于制备抗体、蛋白质、多肽等生物分子的标记物

【试剂详情】 英文名称 Azide-PEG-Azide&#xff0c;N3-PEG-N3 中文名称 叠氮-聚乙二醇-叠氮&#xff0c;聚氧乙烯二叠氮化物 CAS号 82055-94-5 外观性状 由分子量决定&#xff0c;粘稠液体或者固体。 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k&#…

用友GRP A++Cloud 政府财务云 任意文件读取漏洞复现

0x01 产品简介 用友GRP A++Cloud 政府财务云系统具有多项核心功能,旨在满足各类组织的财务管理需求。首先,它提供了财务核算功能,能够全面管理企业的总账、固定资产、现金、应付应收等模块,实时掌握企业的财务状况,并通过科目管理、凭证处理、报表分析等功能为决策提供有…

启明云端ESP8266+企业微信考勤机项目,多种方式认证能防止代打

智能考勤机需要有识别功能&#xff0c;用户容量&#xff0c;记录容量限制&#xff0c;还有物联网通讯方式&#xff0c;最后衔接到云平台&#xff0c;最后就是根据具体需求来设计。 ①识别方式&#xff1a;现如今市场上的考勤机主要有人脸、指纹、IC卡和ID卡等多种识别方式。不…

虚拟机文件夹共享操作(本地访问)

新建一个文件夹 右击文件夹点击属性 找到共享 点击共享 选择本地用户共享就可以了 本地winr 输入我们图片中的格式&#xff08;IP前加 “\\” &#xff09; 会弹一个窗口&#xff0c;输入虚拟机的入户名和密码就可以共享了&#xff08;一般默认用户名都是administrator&am…

人工智能-2024期中考试

前言 人工智能期中考试&#xff0c;认真准备了但是没考好&#xff0c;结果中游偏下水平。 第4题没拿分 &#xff08;遗传算法&#xff1a;知识点在课堂上一笔带过没有细讲&#xff0c;轮盘赌算法在书本上没有提到&#xff0c;考试的时候也没讲清楚&#xff0c;只能靠猜&…

Linux进程——Linux进程与进程优先级

前言&#xff1a;在上一篇了解完一部分常见的进程状态后&#xff0c;我们先来把剩下的进程状态了解一下&#xff0c;再来进入进程优先级的学习&#xff01; 如果对前面Linux进程不太熟悉可以先阅读&#xff1a; Linux进程 本篇主要内容&#xff1a; 僵尸进程和孤儿进程 Linux进…

绘画作品3d数字云展厅提升大众的艺术鉴赏和欣赏能力

3D虚拟展厅作为未来艺术的展示途径&#xff0c;正逐渐成为文化创意产业蓬勃发展的重要引擎。这一创新形式不仅打破了传统艺术展览的局限性&#xff0c;更以其独特的魅力吸引着全球观众的目光。 3D虚拟艺术品展厅以其独特的魅力&#xff0c;助力提升大众的艺术鉴赏和欣赏能力。观…

python - rst file to html

文章目录 python - rst file to html概述笔记下载安装PyCharm最新的学习版新建虚拟环境为Conda的工程添加docutils库新建python文件&#xff0c;添加转换代码运行自己写的python文件&#xff0c;执行转换转换结果END python - rst file to html 概述 开源工程中有一个.rst文件…

自动驾驶主流芯片及平台架构(一)

零部件成本下降、中低端车竞争加剧&#xff0c;推动ADAS渗透率在中国市场快速提升&#xff0c;自主品牌ADAS装配量大幅提升 零部件成本下降、中低端车竞争加剧&#xff0c;推动ADAS渗透率在中国市场快速提升&#xff0c;自主品牌ADAS装配量大幅提升。5年前在一些高端车型上才有…

(持续更新升级)火爆的ChatGPT源码+高质量AI绘画系统+分销功能+详细图文搭建部署教程

随着人工智能技术的迅猛发展&#xff0c;智能对话和创意艺术不再是遥不可及&#xff0c;而是可以触手可及的现实。 分享一款集ChatGPT源码、高质量AI绘画系统以及强大分销功能于一体的系统源码&#xff0c;对接了大名鼎鼎的ChatGPT接口及Midjourney两个王牌接口&#xff0c;另…

C++ 函数与指针

函数内部数据是地址需要传递给调用函数&#xff0c;返回的当然是指针了&#xff01;当然&#xff0c;这个返回地址也可以通过函数参数返回&#xff01; 函数的参数是指针可以输出函数多个结果&#xff0c;返回值本身就是返回数据&#xff0c;什么时候需要返回指针呢&#xff1f…

【北京迅为】《iTOP-3588开发板源码编译手册》-第4章 Android12/Linux设备树简介

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

迅为RK3568开发板资料说明4750+页专属文档专为3568编写

iTOP-3568开发板采用瑞芯微RK3568处理器&#xff0c;内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz&#xff0c;RK809动态调频。集成了双核心架构GPU&#xff0c;ARM G52 2EE、支持OpenGLES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内置独立NPU,算力…

antdVue 自定义table列配置

最近做项目的时候需要对页面的table进行列配置的需求 子组件 <div><a-modaltitle"列配置" :visible"visible" :closable"false" :footer"null"width"800px" height"448px"><div><a-row>…

Netty一文搞懂入门篇<随手笔记>

1.Java IO的读写原理 IO是Input和Output的缩写&#xff0c;即输入和输出。用户程序进行IO的读写基本上会用到read和write两大系统调用。 read把数据从内核缓冲区复制到进程缓冲区&#xff0c;write是把数据从进程缓冲区复制到内核缓冲区。 这两大系统的调用都不负责数据在内核…

Jira Server 不维护了,如何将 Jira 平滑迁移到阿里云云效

作者&#xff1a;天彤 Atlassian 在 2020 年官方发布公告&#xff0c;从 2021 年起停止 Jira Server 产品的销售&#xff0c;并且在 2024 年彻底停止 Server 端产品的服务支持&#xff0c;这对于国内使用 Jira 产品的企业和研发团队造成了不小的影响。而此时国内很多 DevOps 产…