当前位置: 首页 > news >正文

【Unity】实现从Excel读取数据制作年份选择器

效果预览:

此处利用Excel来读取数据来制作年份选择器,具体步骤如下。

如果只是制作年份选择器可以参考我这篇文章:构建简单实用的年份选择器(简单原理示范)

目录

效果预览:

一、 Excel准备与存放

1.1 Excel准备

1.2 存放Excel

1.3 读取Excel准备

二、场景准备 

三、编写脚本 

四、总结 


一、 Excel准备与存放

1.1 Excel准备

打开Excel,填写内容,保存命名为“年份”。示例如下:

1.2 存放Excel

将命名为“年份”的excel文件存放在Assets根目录下

1.3 读取Excel准备

读取Excel的几种方式可以参考这篇文章:读取Excel的几种方式

此处使用DLL插件读取

将所需插件放入Plugins文件夹中

二、场景准备 

 场景包括显示年份的背景和字体等内容,具体可以参考这篇文章: 构建简单实用的年份选择器(简单原理示范)

三、编写脚本 

此处编写了两个脚本,分别是ExcelTool和YearAdsorption,ExcelTool实现读取Excel内容并记录,YearAdsorption来实现生成年份。

using System.Data; // 引入System.Data命名空间,用于处理数据表
using System.IO; // 引入System.IO命名空间,用于文件操作
using Excel; // 引入Excel命名空间,用于读取Excel文件
using UnityEngine; // 引入UnityEngine命名空间,用于Unity相关功能public class ExcelTool : MonoBehaviour
{public static string[] YearsItemsStr;//用来存放Excel中的年份public static int YearsItemsNum; //用来存放Excel中的年份数量void Start(){ReadExcel("/年份.xlsx"); // 调用读取Excel方法,并传入文件路径}// 读取Excel文件public void ReadExcel(string xmlName){FileStream stream = File.Open(Application.dataPath + xmlName, FileMode.Open, FileAccess.Read, FileShare.Read); // 打开Excel文件流//IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);//读取 Excel 1997-2003版本IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); // 使用OpenXml读取 Excel 2007及以后的版本DataSet result = excelReader.AsDataSet(); // 将Excel数据读取到DataSet中if (stream != null){stream.Close(); // 关闭文件流}//DataSet可以包含多个数据表,索引从0开始,所以result.Tables[0]代表第一个表格。int[] counts = GetCount(result.Tables[0]); // 获取Excel表格的行数和列数int rows = counts[0]; // 行数int columns = counts[1]; // 列数YearsItemsNum = rows - 1;//记录年份数量Debug.Log("Excel年份数YearsItemsNum:" + YearsItemsNum);YearsItemsStr = new string[rows - 1];Debug.Log("row:" + rows + "...col:" + columns); // 打印行数和列数信息// 遍历Excel表格并打印内容for (int i = 1; i < rows; i++)//将表头"年份"不包括在内于是i!=0{for (int j = 0; j < columns; j++){Debug.Log(result.Tables[0].Rows[i][j].ToString()); // 打印单元格内容YearsItemsStr[i-1] = result.Tables[0].Rows[i][j].ToString();}}}// 获取数据表的行数和列数private int[] GetCount(DataTable dt){int i = dt.Rows.Count; // 获取行数for (int m = 0; m < dt.Rows.Count; m++){if (string.IsNullOrEmpty(dt.Rows[m][0].ToString())) // 判断第一列是否为空{i = m; // 如果为空,记录有效行数break;}}int j = dt.Columns.Count; // 获取列数for (int n = 0; n < dt.Columns.Count; n++){if (string.IsNullOrEmpty(dt.Rows[0][n].ToString())) // 判断第一行是否为空{j = n; // 如果为空,记录有效列数break;}}return new int[] { i, j }; // 返回行数和列数的数组}
}

using UnityEngine;
using UnityEngine.UI;public class YearAdsorption : MonoBehaviour
{public GameObject yearTextPrefab; // 预设的年份Text对象public ScrollRect scrollRect;public float scaleDifference = 0.5f; // 缩放差异public RectTransform contentRectTrans; // Scroll Rect Content的RectTransformprivate RectTransform[] items;//用来存放生成的年份//int yearsCount = 40; // 年份总数float viewPortSize;float center;int itemCount;void Start(){// 获取ScrollView的视图大小300;viewPortSize = scrollRect.viewport.rect.height;Debug.Log("ScrollView的视图大小:" + viewPortSize);// 计算ScrollView的中心位置center = scrollRect.transform.position.y;// - viewPortSize / 2;       Debug.Log("ScrollView的中心位置:" + center);Debug.Log("YearAdsorption的YearsItemsNum:" + ExcelTool.YearsItemsNum);for (int i = 0; i < ExcelTool.YearsItemsNum; i++)//int i = 0; i < yearsCount; i++{GenerateYearText(ExcelTool.YearsItemsStr[i]);//1950+iint.Parse(ExcelTool.YearsItemsStr[i])Debug.Log("YearAdsorption年份:" + ExcelTool.YearsItemsStr[i]);}//for (int i = 0; i < yearsCount; i++)//int i = 0; i < yearsCount; i++//{//    GenerateYearText((1950 + i).ToString());//1950+iint.Parse(ExcelTool.YearsItemsStr[i])//}// 获取ScrollView中的所有子对象itemCount = scrollRect.content.childCount;items = new RectTransform[itemCount];for (int i = 0; i < itemCount; i++){items[i] = scrollRect.content.GetChild(i).GetComponent<RectTransform>();//Debug.Log("items[i]: " + i);}}void Update(){foreach (RectTransform item in items){// 计算每个项目的中心位置float itemCenter = item.transform.position.y;// - item.rect.height / 2;//Debug.Log("每个项目的中心位置: " + itemCenter);// 计算每个项目相对于ScrollView中心的偏移量float distanceFromCenter = Mathf.Abs(center - itemCenter);// 根据偏移量计算缩放比例float scale = Mathf.Clamp(1 - distanceFromCenter * scaleDifference / viewPortSize, 0.5f, 1f);//Debug.Log("根据偏移量计算缩放比例: " + scale);// 应用缩放item.localScale = new Vector3(scale, scale, 1f);}// 如果用户停止滑动,则吸附到最近的年份if (scrollRect.velocity.magnitude <= 20.0f){SnapToNearestYear();Debug.Log("不移动了!");}}private void GenerateYearText(string year){GameObject yearText = Instantiate(yearTextPrefab, contentRectTrans);yearText.transform.SetAsFirstSibling();yearText.transform.GetComponent<Text>().text = year.ToString();}void SnapToNearestYear(){RectTransform closestItem = null;foreach (RectTransform item in items){float distance = Mathf.Abs(center - item.position.y);if (distance < 35)// 根据需求调整阈值{closestItem = item;Debug.Log("装入了一个Item");}}// 将最近的年份吸附到ScrollView的中心if (closestItem != null){// 计算需要移动的距离float distanceToMove = center - closestItem.position.y;// 将ScrollView的内容向上或向下移动,使最近的年份对象出现在ScrollView的中心scrollRect.content.anchoredPosition += new Vector2(0f, distanceToMove);}}
}

这里注意两个脚本的执行顺序,ExcelTool需要在YearAdsorption之前执行

修改执行顺序可以参考我这篇文章:如何设置Unity脚本的执行顺序?

将两个脚本挂载Canvas上,拖入相应物体并运行 。

四、总结 

以上实现步骤具体内容可参考以下文章:

如何在 Unity 中创建带有缩放效果的滚动视图?(简单方法)

如何在Unity 中创建带有缩放效果的滚动视图(具有吸附效果的实现与优化)

相关文章:

【Unity】实现从Excel读取数据制作年份选择器

效果预览&#xff1a; 此处利用Excel来读取数据来制作年份选择器&#xff0c;具体步骤如下。 如果只是制作年份选择器可以参考我这篇文章&#xff1a;构建简单实用的年份选择器&#xff08;简单原理示范&#xff09; 目录 效果预览&#xff1a; 一、 Excel准备与存放 1.1 …...

Sqli-labs靶场第18关详解[Sqli-labs-less-18]自动化注入-SQLmap工具注入

Sqli-labs-Less-18 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 返回了User Agent&#xff0c;设想如果在User Agent尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会…...

【测开求职】2023秋招快手一面面经

已经过了百度测开三面,快手这个一面比百度的要难很多,可能也是遇到了比较严格的面试官,感觉其他面经没有这么难。30分钟实习,20分钟算法题,20分钟八股,没有问项目。 实习 diff遇到了哪些痛点diff是全量还是增量一些字段的增加或者枚举值的增加可以用diff测吗有哪些自动化…...

【Go语言】Go语言中的字典

Go语言中的字典 字典就是存储键值对映射关系的集合&#xff0c;在Go语言中&#xff0c;需要在声明时指定键和值的类型&#xff0c;此外Go语言中的字典是个无序集合&#xff0c;底层不会按照元素添加顺序维护元素的存储顺序。 如下所示&#xff0c;Go语言中字典的简单示例&…...

Matlab 机器人工具箱 创建机器人

文章目录 1 创建机器人的几种方法1.1 方法11.2 方法21.3 方法31.4 方法41.5 方法51.6 方法6 2 定义Link属性3 查看Link属性 1 创建机器人的几种方法 1.1 方法1 % theta d a alpha sigma >> L1Link([0 1 0.5 0 0],standard)L1 Revolute(std): thetaq, d1, a0…...

跨平台指南:在 Windows 和 Linux 上安装 OpenSSL 的完整流程

Windows安装 一&#xff1a;找到安装包&#xff0c;双击即可 https://gitee.com/wake-up-again/installation-package.git 二&#xff1a;按照提示&#xff0c;一步一步来&#xff0c;就可以啦 三&#xff1a;此界面意思是&#xff0c;是否想向创作者捐款&#xff0c;自己视情…...

JAVA请求示例获取1688商品详情数据API接口item_get-获得阿里巴巴商品详情(按关键词搜索商品列表)

要获取1688&#xff08;阿里巴巴&#xff09;的商品详情数据&#xff0c;你需要使用阿里巴巴开放平台提供的API接口。与淘宝开放平台类似&#xff0c;你需要先在阿里巴巴开放平台注册账号&#xff0c;创建应用&#xff0c;并获取app_key和app_secret。然后&#xff0c;根据阿里…...

安卓手机安装termux、kali linux及基本配置

相关阅读&#xff1a;Termux 高级终端安装使用配置教程 | 国光 百度安全验证 该文安装的 kali liunx 应该是简易版的&#xff0c;没有相关工具 一、下载安装termux 建议通过 f-droid 应用市场下载链接termux&#xff0c;点击即直接下载。 二、配置termux 1.更换镜像源 te…...

Python 实现海康机器人工业相机 MV-CS050-10GC 的实时显示视频流及拍照功能(实时显示视频流同时可以进行拍照)

参考链接&#xff1a; https://www.cnblogs.com/HanYork/p/17388506.html https://www.cnblogs.com/miracle-luna/p/16960556.html#5138211 Flask搭建流媒体服务器&#xff1a;使用Flask搭建一个流媒体服务器_multipart/x-mixed-replace; boundaryframe-CSDN博客...

武器大师——操作符详解(下)

目录 六、单目操作符 七、逗号表达式 八、下标引用以及函数调用 8.1.下标引用 8.2.函数调用 九、结构体 9.1.结构体 9.1.1结构的声明 9.1.2结构体的定义和初始化 9.2.结构成员访问操作符 9.2.1直接访问 9.2.2间接访问 十、操作符的属性 10.1.优先性 10.2.结合性 …...

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:Popup控制)

给组件绑定popup弹窗&#xff0c;并设置弹窗内容&#xff0c;交互逻辑和显示状态。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 popup弹窗的显示状态在onStateChange事件回调中反馈&#xff0c;其显…...

Python系列(20)—— 排序算法

Python中的排序算法 一、引言 排序算法是计算机科学中的基本算法之一&#xff0c;用于将一组数据按照特定的顺序进行排列。Python提供了多种排序算法的实现&#xff0c;包括内置的排序函数和手动实现的排序算法。本文将介绍几种常见的排序算法&#xff0c;并通过代码实例来展…...

MySQL中json类型的字段

有些很复杂的信息&#xff0c;我们一般会用扩展字段传一个json串&#xff0c;字段一般用text类型存在数据库。mysql5.7以后支持json类型的字段&#xff0c;还可以进行sql查询与修改json内的某个字段的能力。 1.json字段定义 ip_info json DEFAULT NULL COMMENT ip信息, 2.按…...

算法学习——GCD与欧拉函数

欧几里得GCD&#xff1a; GCD算法是使用辗转相除法求最大公因数的算法&#xff0c;简单而言就是gcd(a,b) gcd(b,a mod b) 递归写法&#xff1a; int Gcd(int a, int b) {if(b 0)return a;return Gcd(b, a % b); } 迭代写法&#xff1a; int Gcd(int a, int b) {while(b …...

40. 组合总和 II(力扣LeetCode)

文章目录 40. 组合总和 II题目描述回溯算法 40. 组合总和 II 题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff…...

Ubuntu上Jenkins自动化部署Gitee上SpringBoot项目

文章目录 安装安装JDK安装Maven安装GitNodeJS安装&#xff08;可选&#xff09;安装Jenkins 配置Jenkins为Jenkins更换插件源设置jenkins时区安装插件全局工具配置添加Gitee凭证Gitee项目配置 部署后端1.新建任务2.配置源码管理3.构建触发器4.到Gitee中添加WebHook5.构建环境6.…...

延迟任务基于DeyalQueue

一&#xff0c;延迟任务应用场景&#xff1f; 一般用于处理订单&#xff0c;将redis中的数据延迟存入数据库&#xff0c;实现异步存储减少DB的压力 二&#xff0c; 延迟任务的实现方案有很多 DelayQueue Redisson MQ 时间轮 原理 JDK自带延迟队列&#xff0c;基于阻塞队列…...

Linux 查询端口被占用命令

Linux 查询端口被占用命令 1、lsof -i:端口号 用于查看某一端口的占用情况&#xff0c;比如查看8000端口使用情况&#xff0c;lsof -i:8000 lsof -i:8080&#xff1a;查看8080端口占用 lsof abc.txt&#xff1a;显示开启文件abc.txt的进程 lsof -c abc&#xff1a;显示abc进…...

【c++】string类---标准库中的string类

1. 为什么要学习string类 1.1 C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列 库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且…...

GO语言学习笔记(与Java的比较学习)(五)

Map 概念 map 是引用类型&#xff0c;可以使用如下声明&#xff1a; var map1 map[keytype]valuetype var map1 map[string]int 在声明的时候不需要知道 map 的长度&#xff0c;map 是可以动态增长的。 未初始化的 map 的值是 nil&#xff08;即零值为nil&#xff09;&…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...