在Unity环境中读取Excel配置文件(入门)

使用Excel作为配置的优势

a2c7ab4dc148441792feabef0ccc4e2c.png

        使用Excel作为配置文件有相对普通的文本文档/json等类型的配置文件有一个更好的优点,更易于编辑,更易读.譬如上面的例子,我可以制作一个人员名单,可以记录它们的姓名,年龄等信息,每一行就是一个对象,该表就是一个List.

环境准备

GitHub - ExcelDataReader/ExcelDataReader: Lightweight and fast library written in C# for reading Microsoft Excel files

6aa320c7bcbd403d9d233a83f4404f50.png

选择右侧release版本中较新的版本就可以

89ec621fb3f34342b78f47b44c0e6f59.png

        一般下载前两个,将拓展名改为能解压的类型(7z,zip等),然后解压在lib中找到dll,一般选择.netstandard2.0/2.1.放到Unity项目的Plugins文件夹下

代码

        

using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using ExcelDataReader;//引入命名空间
using UnityEngine;namespace Project.Utility
{public class Person{public string name;public int age;public int gender;public string hobby;}public class GetConfigUtility {/// <summary>/// 加载Excel配置,必须放在StreamingAssets/ConfigFiles下(必须放在StreamingAssets下)/// </summary>/// <param name="excelFileName">文件名(需加文件后缀)</param>/// <returns>返回一个Dictionary(表名,表)</returns>public Dictionary<string, DataTable> GetExcelConfig(string excelFileName){//拼接路径string path = Path.Combine(Application.streamingAssetsPath, "ConfigFiles", excelFileName);//获得该Excel文件的流using (var stream = File.Open(path, FileMode.Open, FileAccess.Read)){//这个流给到ExcelReaderFactory,创建一个ExcelReader对象using (var reader = ExcelReaderFactory.CreateReader(stream)){// 配置 DataSet 读取var conf = new ExcelDataSetConfiguration{ConfigureDataTable = _ => new ExcelDataTableConfiguration{UseHeaderRow = true // 使用第一行作为列标题}};//实例一个字典,键是表名(因为可以获取很多张表),值是一个表的对象Dictionary<string, DataTable> dataTableDic = new Dictionary<string, DataTable>();var dataSet = reader.AsDataSet(conf);//获取一个DataSet对象//从DataSet对象中的Tables属性中遍历所有的表foreach (DataTable dataTable in dataSet.Tables){dataTableDic.Add(dataTable.TableName, dataTable);}return dataTableDic;}}}//读取某个表转为Listpublic List<Person> GetPersonList(Dictionary<string, DataTable> excelDic){var personList = new List<Person>();DataTable t = excelDic["你的表名"];//索引器填表名拿到表for (int i = 0; i < t.Rows.Count; i++)//Rows属性代表所有行{Person person = new Person();//Rows[i]拿到具体的行,第一行被忽略,因为上面使用了ExcelDataSetConfiguration//Rows[i][0]代表i行第0个元素,但是类型是objperson.name = t.Rows[i][0].ToString();person.gender = int.Parse(t.Rows[i][1].ToString());person.age = int.Parse(t.Rows[i][2].ToString());person.name = t.Rows[i][3].ToString();personList.Add(person);}return personList;}}}

注意:

        如果你直接使用我上述的做法,可能会遇到一个1252编码问题,细致的说就是编辑器环境正常,但是Unity打了包就无法正常读取Excel了,这个库读取Excel需要能支持1252编码的组件,但是这个组件Unity编辑器环境有,但是打包环境没有(应该是为了更轻量,剔除了),所以我将其做成了一个编辑器工具,就是在编辑器环境时将Excel数据转成ScriptObject,

c2e1e89e695142b4ada1e51523b6caf4.png

就像这样,这是Unity原生的,就不会出任何问题,而且我制作的非常方便,稍作配置就能一键生成,但是还有一个不完美的地方就是:譬如你可以在steamingAssets目录下放入Excel,如果能直接读取,打包之后可以很方便的直接替换Excel,但是我这里因为制成了ScriptObject,所以这个灵活性就没有了.

 

如果你确实需要这个灵活性,那么请阅读官方的这一段

257d6dc45ed7450e8d622005ed3e8be2.png

 

但是这需要带入一些依赖.

git中找到文件夹1252问题,将dll都放到Plugins下,查看Example脚本解决这个问题.

如果你使用我的转化为ScriptObject的方案,那么直接删除1252文件夹.否则你可以使用上面的Api来直接读取Excel,但是不要忘了将1252文件夹下的Dll导入Plugins,再添加这句注册代码:System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);.

personTool: 个人开发的小功能,每个文件夹的功能能做到开箱即用.

这个工具我已经封装好了.

7e8230ec471d4924a82c27f472c75d26.png

下载后进入ExcelDataReader目录.将里面的内容拷贝到一个空的项目中,推荐Unity版本在2021.3.37f1c1或者更高.

 

如果编译没出问题,你会发现6fb0da9bd4804aebb1f3d86a9d451b61.png

Tools下面出现一个自动生成的按钮.

2f4f23d2536f41a098d3d98afbd01200.png

点击会出现这样的窗口,先点击第一个按钮,这会生成对应的类文件,等待编译.然后点击第二个按钮,就会生成ScriptObject了.

f15afebb178944b5bcc578dc05c122c1.png

如果你需要迁移到别的工程,将脚本和ScriptObject都复制过去.

下面可以查看我第二篇文章.

在Unity环境中读取Excel配置文件(进阶)_unity读取excel文件-CSDN博客

你可以简单了解下原理

 

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

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

相关文章

Maven maven项目构建的生命周期 Maven安装配置 IDEA 配置 Maven

一&#xff0c;Maven的概述 Maven的作用&#xff1a;专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;提…

VM虚拟机装MAC后无法联网,如何解决?

✨在vm虚拟机上&#xff0c;给虚拟机MacOS设置网络适配器。选择NAT模式用于共享主机的IP地址 ✨在MacOS设置中设置网络 以太网 使用DHCP ✨回到本地电脑上&#xff0c;打开 服务&#xff0c;找到VMware DHCP和VMware NAT&#xff0c;把这两个服务打开&#xff0c;专一般问题就…

day06(单片机高级)PCB设计

目录 PCB设计 PCB设计流程 元器件符号设计 原理图设计 元器件封装设计 元器件库使用 PCB设计 目的&#xff1a;学习从画原理图到PCB设计的整个流程 PCB设计流程 元器件符号设计 元器件符号&#xff1a;这是电子元器件的图形表示&#xff0c;用于在原理图中表示特定的元器件。例…

向量数据库FAISS之一:官方简单教程

1.安装 1.conda安装 # CPU-only version --> Linux (x86_64 and arm64), OSX (arm64 only), and Windows (x86_64) $ conda install -c pytorch faiss-cpu1.8.0# GPU(CPU) version --> Linux (x86_64 only) for CUDA 11.4 and 12.1 $ conda install -c pytorch -c nvid…

VMware Workstation 17.6.1

概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1&#xff1a; 本月11号官宣&#xff1a;针对所有人免费提供&#xff0c;包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后&#xff0c;双击默认安装即可&#xff1a; 一路单击下一步按钮&#xff1a; 等待…

java实现小程序接口返回Base64图片

文章目录 引言I java 接口返回Base64图片接口设计获取验证码图片-base64字符串获取验证码图片-二进制流arraybufferII 小程序端代码过期代码: 显示文件流图片(arraybuffer)知识扩展:微信小程序下载后端返回的文件流引言 场景: 图形验证码 背景: 接口返回arraybuffer的格式…

transformer.js(一):这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景

随着大模型的广泛应用&#xff0c;越来越多的开发者希望在前端直接运行机器学习模型&#xff0c;从而减少对后端的依赖&#xff0c;并提升用户体验。Transformer.js 是一个专为前端环境设计的框架&#xff0c;它支持运行基于 Transformer 架构的深度学习模型&#xff0c;尤其是…

xiaolin coding 图解网络笔记——HTTP篇

1. HTTP 是什么&#xff1f; HTTP 是超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;一个用在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的【约定和规范】。 2. HTTP 常见的状态码有哪些&#xff1f; …

23种设计模式-模板方法(Template Method)设计模式

文章目录 一.什么是模板方法模式&#xff1f;二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图&#xff1a; 模板方法设计模式类图 一.什么是模板方法模…

力扣 LeetCode 235. 二叉搜索树的最近公共祖先(Day10:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归 递归法没有中的逻辑 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {return recur(root, p, q);}public TreeNode recur(TreeNode root, TreeNode p, TreeNode q) {if (root…

Python数据结构day2

一、链表 1.1目的 解决顺序表存储数据有上限&#xff0c;并且插入和删除操作效率低的问题 1.2概念 链表&#xff1a;链式存储的线性表&#xff0c;使用随机物理内存存储逻辑上连续的数据 链表的组成&#xff1a;由一个个结点组成 结点&#xff1a;由数据域和链接域组成&a…

Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Flink Lookup Join(维表 Join)

Lookup Join 定义&#xff08;支持 Batch\Streaming&#xff09; Lookup Join 其实就是维表 Join&#xff0c;比如拿离线数仓来说&#xff0c;常常会有用户画像&#xff0c;设备画像等数据&#xff0c;而对应到实时数仓场景中&#xff0c;这种实时获取外部缓存的 Join 就叫做维…

LeetCode 101题集(随时更新)

题集来源&#xff1a;GitHub - changgyhub/leetcode_101: LeetCode 101&#xff1a;力扣刷题指南 使用C完成相关题目&#xff0c;以训练笔试 贪心 采用贪心的策略&#xff0c;保证每次操作都是局部最优的&#xff0c;从而使最后得到的结果是全局最优的。 分配问题 455. 分发饼…

百度主动推送可以提升抓取,它能提升索引量吗?

站长在建站SEO的时候&#xff0c;需要用到百度站长平台&#xff08;资源平台&#xff09;的工具&#xff0c;在站长工具中【普通收录】-【资源提交】-【API提交】这个功能&#xff0c;对网站的抓取进行一个提交。 这里估计很多站长就有疑问&#xff0c;如果我主动推送&#xf…

DevOps-Jenkins-新手入门级

1. Jenkins概述 1. Jenkins是一个开源持续集成的工具&#xff0c;是由JAVA开发而成 2. Jenkins是一个调度平台&#xff0c;本身不处理任何事情&#xff0c;调用插件来完成所有的工作 1.1 什么是代码部署 代码发布/部署>开发书写的程序代码---->部署测试/生产环境 web服务…

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…

51c大模型~合集76

我自己的原文哦~ https://blog.51cto.com/whaosoft/12617524 #诺奖得主哈萨比斯新作登Nature&#xff0c;AlphaQubit解码出更可靠量子计算机 谷歌「Alpha」家族又壮大了&#xff0c;这次瞄准了量子计算领域。 今天凌晨&#xff0c;新晋诺贝尔化学奖得主、DeepMind 创始人哈萨…

怎么只提取视频中的声音?从视频中提取纯音频技巧

在数字媒体的广泛应用中&#xff0c;提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途&#xff0c;提取声音都能为我们带来诸多便利。怎么只提取视频中的声音&#xff1f;本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…