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

Unity读取和写入本地Excel表格数据完整指南

1. 前言

在Unity游戏开发中,经常需要处理配置数据,如角色属性、关卡信息、道具列表等。Excel表格因其直观的表格形式和强大的数据处理能力,常被用作数据源。本文将详细介绍在Unity中读取和写入本地Excel表格数据的几种主流方案,并提供完整的代码示例。

2. 方案选择与准备

Unity本身不提供直接操作Excel文件的功能,需要借助第三方库。以下是几种常用方案:

  • EPPlus(推荐):一个开源的.NET库,无需安装Office,支持读写.xlsx格式。
  • NPOI:另一个流行的.NET开源库,支持.xls和.xlsx格式。
  • ExcelDataReader:专注于读取Excel数据,轻量快速。
  • Unity内置的TextAsset/CSV:将Excel另存为CSV,通过Unity的TextAsset读取。

本文将以EPPlus为例进行讲解,因为它功能全面、性能良好且无需依赖Office。

3. 环境配置

3.1 获取EPPlus库

访问 EPPlus GitHub仓库 下载最新Release的EPPlus.dll。或者通过NuGet包管理器安装。

3.2 导入Unity项目

  1. 在Unity项目Assets目录下创建Plugins文件夹。
  2. 将下载的EPPlus.dll放入Assets/Plugins中。
  3. 确保Unity编辑器设置中,该DLL的“平台兼容性”包含“Editor”和“Standalone”。

注意:EPPlus依赖.NET 4.x或更高版本。请在Unity的Player Settings->Other Settings->Configuration中将Scripting Backend设置为IL2CPPMono,并将Api Compatibility Level设置为.NET Framework.NET Standard 2.0

4. 读取Excel数据

以下示例演示如何读取一个名为GameConfig.xlsx的Excel文件,其第一张工作表结构如下:

IDNameHPAttack
1001英雄10020
1002怪物5010
using System; using System.Collections.Generic; using System.IO; using OfficeOpenXml; using UnityEngine; public class ExcelReader : MonoBehaviour { // 定义数据结构类 [System.Serializable] public class CharacterData { public int ID; public string Name; public int HP; public int Attack; } void Start() { // Excel文件路径(放在Assets同级目录的Data文件夹下) string filePath = Path.Combine(Application.dataPath, "../Data/GameConfig.xlsx"); if (!File.Exists(filePath)) { Debug.LogError("Excel文件不存在: " + filePath); return; } // 使用EPPlus读取 FileInfo fileInfo = new FileInfo(filePath); using (ExcelPackage package = new ExcelPackage(fileInfo)) { // 获取第一个工作表 ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 确定数据范围(假设第一行是标题) int rowCount = worksheet.Dimension.Rows; int colCount = worksheet.Dimension.Columns; List<CharacterData> dataList = new List<CharacterData>(); // 从第二行开始读取数据(跳过标题行) for (int row = 2; row <= rowCount; row++) { CharacterData data = new CharacterData(); data.ID = Convert.ToInt32(worksheet.Cells[row, 1].Value); data.Name = worksheet.Cells[row, 2].Value?.ToString(); data.HP = Convert.ToInt32(worksheet.Cells[row, 3].Value); data.Attack = Convert.ToInt32(worksheet.Cells[row, 4].Value); dataList.Add(data); Debug.Log($"读取: ID={data.ID}, Name={data.Name}, HP={data.HP}, Attack={data.Attack}"); } Debug.Log($"共读取 {dataList.Count} 条角色数据。"); } } }

5. 写入Excel数据

以下示例演示如何创建一个新的Excel文件并写入数据。

using System.IO; using OfficeOpenXml; using UnityEngine; public class ExcelWriter : MonoBehaviour { void Start() { // 设置LicenseContext(EPPlus 5.0+ 需要) ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 定义要写入的数据 var dataList = new[] { new { ID = 2001, Name = "武器A", Price = 150, Type = "Sword" }, new { ID = 2002, Name = "武器B", Price = 300, Type = "Bow" }, new { ID = 2003, Name = "武器C", Price = 500, Type = "Staff" } }; // 文件保存路径 string savePath = Path.Combine(Application.dataPath, "../Data/WeaponData.xlsx"); // 创建Excel包和工作表 using (ExcelPackage package = new ExcelPackage()) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Weapons"); // 写入标题行 worksheet.Cells[1, 1].Value = "ID"; worksheet.Cells[1, 2].Value = "Name"; worksheet.Cells[1, 3].Value = "Price"; worksheet.Cells[1, 4].Value = "Type"; // 设置标题行样式 using (var range = worksheet.Cells[1, 1, 1, 4]) { range.Style.Font.Bold = true; range.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; range.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray); } // 写入数据行 for (int i = 0; i < dataList.Length; i++) { int row = i + 2; // 从第二行开始 worksheet.Cells[row, 1].Value = dataList[i].ID; worksheet.Cells[row, 2].Value = dataList[i].Name; worksheet.Cells[row, 3].Value = dataList[i].Price; worksheet.Cells[row, 4].Value = dataList[i].Type; } // 自动调整列宽 worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns(); // 保存文件 FileInfo fileInfo = new FileInfo(savePath); package.SaveAs(fileInfo); Debug.Log("Excel文件已保存至: " + savePath); } } }

6. 进阶技巧与注意事项

6.1 处理多种数据类型

Excel单元格可能包含字符串、数字、日期、布尔值等。读取时应进行类型判断和转换:

object cellValue = worksheet.Cells[row, col].Value; if (cellValue != null) { if (cellValue is double) intValue = Convert.ToInt32((double)cellValue); else if (cellValue is int) intValue = (int)cellValue; else if (cellValue is string) stringValue = cellValue.ToString(); // ... 其他类型处理 }

6.2 跨平台路径处理

在Unity中,不同平台的持久化数据路径不同,应使用Application.persistentDataPath

// 推荐:将Excel文件放在可读写目录 string excelPath = Path.Combine(Application.persistentDataPath, "Config/GameData.xlsx");

6.3 性能优化

  • 批量读取:使用worksheet.Cells.Value获取整个区域的对象数组进行批量处理。
  • 避免频繁创建/销毁:对于需要频繁读写的配置,可考虑在启动时加载到内存中的数据结构(如Dictionary、List)。
  • 异步操作:读写大文件时使用async/await或协程,避免阻塞主线程。

6.4 常见错误处理

  • 文件被占用:确保在using语句中操作ExcelPackage,以正确释放资源。
  • 格式不匹配:EPPlus主要支持.xlsx格式,对于.xls文件建议使用NPOI。
  • 权限问题:检查目标目录的读写权限。

7. 替代方案:CSV格式

如果数据量不大且结构简单,可将Excel另存为CSV,利用Unity内置的TextAsset读取:

// 将CSV文件放在Resources文件夹下 TextAsset csvFile = Resources.Load<TextAsset>("GameConfig"); string[] lines = csvFile.text.Split('\n'); foreach (string line in lines) { string[] fields = line.Split(','); // 解析每一行数据 }

优点:无需第三方DLL,跨平台兼容性好。
缺点:不支持多工作表、单元格格式和公式。

8. 总结

在Unity中操作Excel数据,EPPlus是一个功能强大且易于集成的选择。本文提供了从环境配置、读取、写入到进阶优化的完整流程。关键步骤总结如下:

  1. 根据需求选择合适的库(EPPlus、NPOI等)。
  2. 正确配置Unity的.NET版本并导入DLL。
  3. 使用ExcelPackageExcelWorksheet进行读写操作。
  4. 注意类型转换、路径处理和异常捕获。
  5. 对于简单需求,可考虑使用CSV格式作为轻量级替代方案。

掌握这些技能后,你可以轻松地将Excel表格作为强大的数据配置工具集成到Unity项目中。

http://www.jsqmd.com/news/1145054/

相关文章:

  • Vivado 2024.1 时序约束实战:从 0 到 1 完成 100MHz FIFO 异步时钟组约束
  • 你的“老婆”正在消失:一个Galgame玩家的五年“打捞”计划,建了座8万人注册的“数字方舟”
  • 3D文件格式解析:建筑师与设计师指南
  • 从 pthread 到 std::thread:一文吃透 Linux 线程底层模型与跨平台封装本质
  • OpenFaaS:在 Kubernetes 上跑函数更简单
  • 贝叶斯优化 (BO) 实战:5 种采集函数 (EI/UCB/PI) 在超参数调优中的性能对比
  • 简化办公重复工作 OpenClaw可视化部署实操全过程
  • YOLOv5环境配置到Qt集成的完整指南
  • 3 种工业镜头景深计算方案对比:公式、查表与仿真工具实测
  • 许可管理系统的四大核心功能,你都了解吗?
  • DMA 传输方向 + 配合ADC/UART/SPI 速记笔记
  • 如何高效推广GEO优化,抢占AI本地流量蓝海
  • 2026 福州全屋定制性价比排行:不同预算的选型参考
  • Gemini-3-Pro 提示词工程规范与 Python SDK 高级集成指南
  • 智能电视上有哪些好用的软件?
  • 泛程序收录低?这些优化解决方法值得一试
  • 彻底解决Python多版本冲突!下载安装+环境变量配置全流程详解!
  • 为什么说许可管理是企业数字化的基础工程?
  • 论文 AI 降重工具选型全指南:从安全、改写逻辑、查重适配三维筛选靠谱服务
  • Docker 镜像拉取失败:`failed commit on ref` 错误排查与 4 种镜像源修复方案
  • 豆包智能体对话怎么批量导出?Word/PDF/Excel 归档流程
  • OpenAI 微调权限收口后,先把评测和回退链路补起来
  • Postgresql 数据库 自增字段,Vastbase 无效的问题
  • 找到高薪工作的第一步:初步了解python
  • 磁吸转轴支架主流防松结构设计全解:5 类方案对比与选型指南
  • 如何用novel-downloader轻松下载全网100+小说网站?终极指南来了!
  • Linux 内核软中断子系统 九章编译法,AI直译完成汇编码
  • 我是如何利用 WorkBuddy 创建一个项目经营分析表解读 Skill 的
  • Spark 4.1.2 + Scala 2.13 开发环境:IntelliJ IDEA 2024.3 与 SBT 1.9.9 配置实战
  • 第二章Netty,EventLoop线程切换源码分析