【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 中创建带有缩放效果的滚动视图(具有吸附效果的实现与优化)

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

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

相关文章

openssl3.2 - exp - calc PE file checksum and SHA3-512

openssl3.2 - exp - calc PE file checksum and SHA3-512 概述 想在程序中, 对自身的PE内容算校验和和HASH, 然后送给服务端判断PE文件是否被修改了. 前几天, 看了一个资料, 里面有算PE校验和的实现. 迁移到自己工程. 但是没有算HASH, 正好已经将openssl官方demo过了一遍, 有…

K8s Pod资源管理组件

目录 Pod基础概念 在Kubrenetes集群中Pod有如下两种使用方式 pause容器使得Pod中的所有容器可以共享两种资源 网络 存储 总结 kubernetes中的pause容器主要为每个容器提供功能 Kubernetes设计这样的Pod概念和特殊组成结构的用意 通常把Pod分为以下几类 自主式Pod 控…

【字符串】-Lc3-无重复字符的最长子串(indexOf(String str, int fromIndex))

写在前面 最近想复习一下数据结构与算法相关的内容&#xff0c;找一些题来做一做。如有更好思路&#xff0c;欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.代码 写在后面 一、场景描述 给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串 &…

input css padding

这样控件会跑出外套控件在HTML JSP里面是经常出现的。但有些外国adobe的as控件不存在这种情况&#xff0c;这是因为内层控件定义的时候不能超出外层控件的范围。 修改下&#xff1a;去掉原来css padding&#xff0c;然后加上宽度和高度

C语言 常量

常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&#xff0c;比如整数常量、浮点常量、字符常量&#xff0c;或字符串字面值&#xff0c;也有枚举常量。 常量就像是常规的变量&#xff0c;只不过常量的…

EAP-TLS实验之Ubuntu20.04环境搭建配置(FreeRADIUS3.0)(四)

该篇主要介绍了利用配置ca.cnf、server.cnf、client.cnf在certs路径下生成证书文件&#xff08;非执行bootstrap脚本&#xff0c;网上也有很多直接通过openssl命令方式生成的文章&#xff09;&#xff0c;主要参考&#xff08;概括中心思想&#xff09;官方手册&#xff0c;以及…

s-table和columns初始化不完整,造成table文件的filter报错

问题 顺藤摸瓜找errorHandler.js文件 发现文件并没有什么问题 顺藤摸瓜找index.vue文件 首先找到报错的filter&#xff0c;发现与columnsSetting相关 找到columnsSetting发现等于columns 返回自己使用S-table组件的地方&#xff0c;发现columns初始化时仅初始化为ref()未表明…

统信软件:统一操作系统 UOS 代言人

这是ren_dong的第32篇原创 1、Deepin Deepin&#xff1a;最受欢迎的民用国产操作系统 2008 年,Deepin 操作系统最早版本正式发布&#xff0c;是由 深之度创始人刘闻欢组织团队研发的基于 Debian 的本地化 Linux 操作系统 2011 年,武汉深之度科技有限公司成立&#xff0c;开始产…

Facebook的虚拟社交愿景:元宇宙时代的新起点

在当今数字化时代&#xff0c;社交媒体已经成为人们生活中不可或缺的一部分。而随着科技的不断进步和社会的发展&#xff0c;元宇宙已经成为了人们关注的热点话题之一。作为社交媒体的领军企业之一&#xff0c;Facebook也在积极探索虚拟社交的未来&#xff0c;将其视为元宇宙时…

LeetCode 2886.改变数据类型

DataFrame students ------------------- | Column Name | Type | ------------------- | student_id | int | | name | object | | age | int | | grade | float | ------------------- 编写一个解决方案来纠正以下错误&#xff1a; grade 列被存储为浮点数&#xff0c;将它转…

6U VPX全国产飞腾D2000/8核+复旦微FPGA信息处理主板

产品特性 产品功能 飞腾计算平台&#xff0c;国产化率100% VPX-MPU6503是一款基于飞腾D2000/8核信息处理主板&#xff0c;采用由飞腾D2000处理器飞腾X100桥片的高性能计算机模块&#xff0c;双通道16G贴装内存&#xff0c;板载128G 固态SSD&#xff1b;预留固态盘扩展接口&…

cppzmq入门

cppzmq是一个基于ZeroMQ的开源C 库&#xff0c;用于构建分布式和并发应用程序。它提供了与ZeroMQ消息队列进行通信的简单接口。本文将介绍cppzmq的基本概念、常用模式以及示例代码。 基本概念 ZeroMQ&#xff1a;ZeroMQ是一个轻量级的消息队列库&#xff0c;它允许应用程序通过…

LaTeX笔记

文章目录 基本操作文本加粗 图片插入引用 表格插入引用 公式插入引用 参考文献超链接跳转问题修改hyperref包属性&#xff0c;去掉方框 latex入门指南&#xff1a;插入图片、表格、公式方法一览_latex插入表格-CSDN博客 基本操作 文本加粗 先选中&#xff0c;再 ctrlb 图片…

试题 算法训练 礼物

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 JiaoShou在爱琳大陆的旅行完毕&#xff0c;即将回家&#xff0c;为了纪念这次旅行&#xff0c;他决定带回一些礼物给好朋友。…

蓝桥杯第十二届电子类单片机组程序设计

目录 前言 蓝桥杯大赛历届真题_蓝桥杯 - 蓝桥云课&#xff08;点击查看&#xff09; 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十二届比赛原题 1.比赛题目 2.题目解读 蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客 二、…

金三银四面试必问:Redis真的是单线程吗?

文章目录 01 Redis中的多线程1&#xff09;redis-server&#xff1a;2&#xff09;jemalloc_bg_thd3&#xff09;bio_xxx&#xff1a; 02 I/O多线程03 Redis中的多进程04 结论▼延伸阅读 由面试题“Redis是否为单线程”引发的思考 作者&#xff1a;李乐 来源&#xff1a;IT阅读…

Android Kotlin协程实战

你能听懂的Kotlin协程课&#xff0c;跟老司机学&#xff0c;不用自己瞎折腾 认识协程 协程难在哪儿? Ja v a中不曾出现的&#xff0c;新概念概念不清晰&#xff0c;我们看到的大都是不同语言对于协程的实现或者衍生Kotlin 基础不扎实多线程编程基础太薄弱 协程是什么? 协…

OpenAI最新发布的文生视频模型Sora到底强在哪?

文章目录 1.Sora到底强在哪&#xff1f;2. 不足3. 结尾 2024年2月16日&#xff0c;当大家沉浸在过年的喜庆氛围中&#xff0c;OpenAI发布首款文生成视频大模型 Sora &#xff0c;其炸裂登场让人感到惊艳。 Sora官网介绍&#xff1a;https://openai.com/sora 说起文生视频工具…

SLA 是什么?如何实现 SLA 管理

随着业务的不断壮大&#xff0c;为了满足日益增长的客户需求&#xff0c;网络必须保持与这些需求同步。同时&#xff0c;为了提高最终用户的体验&#xff0c;运维人员/网络管理员在监控企业级网络时遇到了不少瓶颈&#xff0c;必须不断审查网络&#xff0c;以确保提供的服务质量…

【Python笔记-设计模式】备忘录模式

一、说明 备忘录模式是一种行为设计模式&#xff0c;允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 (一) 解决问题 主要解决在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态&#xff0c;以便在需要时恢复对象…