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

news2024/11/27 10:22:06

参考:用两种简单的方式实现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;
    }
}

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

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

相关文章

简易录制视频做3D高斯

系统环境 ubuntu20 &#xff0c;cuda11.8&#xff0c;anaconda配置好了3D高斯的环境。 具体参考3D高斯环境配置&#xff1a;https://blog.csdn.net/Son_of_the_Bronx/article/details/138527329?spm1001.2014.3001.5501 colmap安装&#xff1a;https://blog.csdn.net/Son_of…

【网络基础2】深入理解TCP协议:协议段、可靠性、各种机制

文章目录 1. TCP协议段格式1.1. 如何解包 / 向上交付1.1.1. 交付1.1.2. 解包 1.2. 如何理解可靠性1.2.1. 确认应答机制&#xff08;ACK&#xff09;1.2.2. 序号 与 确认序号 2. TCP做到全双工的原因2.1. 16位窗口大小2.2. 6个标记位 3. 如何理解连接3.1 连接管理机制3.1.1. 三次…

通俗易懂,Java之Collection接口带你了解集合类型

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

风吸式杀虫灯解析

TH-FD2S风吸式杀虫灯是一种创新且环保的害虫控制设备&#xff0c;它结合了太阳能和风力的双重优势&#xff0c;为农业生产、园林绿化以及居民生活等提供了高效且安全的害虫防治方案。 首先&#xff0c;风吸式杀虫灯的工作原理是利用害虫的趋光性&#xff0c;通过特定的光源吸引…

后仿真中的关于延时问题(物理特性角度)

大家都知道&#xff0c;后仿真讲究仿真时序。那么&#xff0c;在网表阶段&#xff0c;接触到后仿延时问题。今天总结一下。 一 延时概念和分类 1.1 分布式延迟&#xff08;Distributed Delays&#xff09; 一般用来指定模块内部信号通过逻辑单元或者线网耗费的时间。 1.2 模…

【嵌入式必读】一文彻底理解PID自整定及PID自整定代码设计

文章目录 1. 前言2. PID简介3. 常用的PID自整定方法3.1 临界度比例法3.2 衰减曲线法 4. 继电反馈整定法原理4.1 继电反馈自整定的基本思想4.2 继电反馈自整定原理 5. 算法设计5.1 振荡的生成5.2 提取出临界周期 T c T_c Tc​和振荡波形幅值 A A A5.3 计算出PID参数 6 原代码6.1…

SQL Server 存储过程中的字符串本身包含单引号的用法

文章目录 引言I 存储过程中的字符串本身包含单引号的用法1.1 问题1.2解决方法引言 使用场景: 字符串类型字段的值比较 I 存储过程中的字符串本身包含单引号的用法 在SQL Server中,单引号用于表示字符串常量。如果你的存储过程中的字符串本身包含单引号,你需要用两个连续的…

PMP的考试费用是多少啊?大概需要多少钱?

如何以最低的经济成本取得PMP证书呢&#xff1f;PMP的认证考试费用包括考试报名费、学习备考费用和续证费用三个部分。 考试报名费用 PMP考试费用&#xff1a;PMP普通申请者初次考试费用为固定3900元人民币&#xff0c;补考&#xff08;重考&#xff09;费用为2500元人民币。退…

springboot 获取maven打包时间

springboot 获取maven打包时间 pom <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.13.RELEASE</version><relativePath /> <!-- lookup parent…

【Linux系列】file命令

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C语言常见的动态内存错误及几个经典笔试题以及c/c++内存开辟空间等的介绍

文章目录 前言一、常见的动态内存错误1. 对NULL指针的解引用操作2. 对动态开辟空间的越界访问3. 对非动态开辟内存使用free()4. 使用free释放一块动态开辟内存的一部分5. 对同一块动态内存多次释放6. 动态开辟内存忘记释放&#xff08;内存泄漏&#xff09; 二、几个经典笔试题…

【busybox记录】【shell指令】shuf

目录 内容来源&#xff1a; 【GUN】【shuf】指令介绍 【busybox】【shuf】指令介绍 【linux】【shuf】指令介绍 使用示例&#xff1a; 打乱内容 - 默认输出 打乱内容 - 最多输出n行 打乱内容 - 将输出写入文件 打乱内容 - 重复输出 打乱内容 - 打乱本条指令的参数 打…

Concise CoT(CCoT)提示词工程

原文地址&#xff1a;concise-chain-of-thought-ccot-prompting 2024 年 1 月 24 日 传统的 CoT 是以增加输出令牌使用为代价的&#xff0c;CCoT 提示是一种提示工程技术&#xff0c;旨在减少 LLM 响应的冗长和推理时间。 基于LLMs的生成式人工智能应用程序必须使用多管齐下的方…

静态分配IP,解决本地连接不上Linux虚拟机的问题

在Window环境下&#xff0c;使用远程终端工具连接不了VMware搭建的Linux虚拟机&#xff08;CentOS 7&#xff09;&#xff0c;并且在命令行ping不通该Linux虚拟机的IP地址。下面通过配置网关解决本地与Linux虚拟机连接问题&#xff1a; 1 查看虚拟机网关地址 在VMware虚拟机上…

文本清洁器:如何一键批量删除空格,让内容更整洁的技巧

在日常工作和学习中&#xff0c;我们经常需要处理大量的文本内容。而文本中多余的空格往往会让内容显得杂乱无章&#xff0c;影响阅读体验。为了解决这个问题&#xff0c;我们可以使用办公提效工具来一键批量删除空格&#xff0c;让内容更加整洁易读。 一、为什么需要批量删除空…

js宏任务微任务输出解析

第一种情况 setTimeout(function () {console.log(setTimeout 1) //11 宏任务new Promise(function (resolve) {console.log(promise 1) //12 同步函数resolve()}).then(function () {console.log(promise then) //13 微任务})})async function async1() {console.log(async1 s…

AI模型:windows本地运行下载安装ollama运行Google CodeGemma可离线运行数据模型【自留记录】

AI模型&#xff1a;windows本地运行下载安装ollama运行Google CodeGemma可离线运行数据模型【自留记录】 CodeGemma 没法直接运行&#xff0c;需要中间软件。下载安装ollama后&#xff0c;使用ollama运行CodeGemma。 类似 前端本地需要安装 node.js 才可能跑vue、react项目 1…

华为:三层交换机与路由器连通上网实验

三层交换机是一种网络交换机&#xff0c;可以实现基于IP地址的高效数据转发和路由功能&#xff0c;通常用于大型企业、数据中心和校园网络等场景。此外&#xff0c;三层交换机还支持多种路由协议&#xff08;如OSPF、BGP等&#xff09;&#xff0c;以实现更为复杂的网络拓扑结构…

Java数据结构---链表

目录 链表的基本概念 LinkedList ArrayList和LinkedList的区别 链表的基本概念 当在ArrayList任意位置插入或删除元素时&#xff0c;就需要将后续元素整体往前或者整体往后搬移&#xff0c;时间复杂度O&#xff08;n&#xff09;&#xff0c;效率比较低&#xff0c;因此Arra…

【计算机科学速成课】笔记三

文章目录 17.集成电路真空管时代晶体管时代集成电路时代印刷电路板时代光刻时代 17.集成电路 Over the past six episodes, we delved into software, 过去 6 集我们聊了软件 \N 从早期编程方式到现代软件工程 from early programming efforts to modern software engineerin…