在做游戏的过程中肯定需要大量的数据,不管是UI上的还是玩家身上需要的等等,获取数据比较简单的方式就是在一些表中读取嘛,很多游戏公司是把一些数据放到表中让策划去配,有的是Excel表,有的是TXT文件,还有csv等很多其他的,反正各有各的神通。因为毕设也不会用太多东西,所以简单写了一下适合自己工程的,好坏就不探究了。
参考文章:点击这里获取跟excel相关dll并先做了解
首先可以大致了解一下我想要效果:
整个逻辑可以简单地总结为:拿到一张Excel表格,自动生成一个跟表格数据相关的类,一张表对应一个cs文件,然后能在TableManager中自动生成获取表格数据的方法,对所有的Excel都执行这个操作,简简单单。
做的过程中可能会报System.Data不匹配的错误,这个可以直接导入自己unity路径下的System.Data.dll,路径:u3d\Editor\Data\Mono\lib\mono\2.0。
························································································
首先我们在工程里建一个文件夹来存放Excel表格,然后要有存放表格类的文件夹或路径,还有生成TableManager.cs文件的路径。可以个文件进行配置:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ExcelConfig
{
/// <summary>
/// 存放excel表文件夹的的路径,本例excel表放在了"Assets/Excel/"当中
/// </summary>
public static readonly string excelsFolderPath = Application.dataPath + "/Excel/";
/// <summary>
/// 存放表格对应类的cs文件路径
/// </summary>
public static readonly string TableClassPath = "Assets/Game/Script/TableScript/";
/// <summary>
/// 存放TableManager的文件夹路径
/// </summary>
public static readonly string TableManagerPath = "Assets/Game/Script/TableRead/";
}
表格后缀类型是“.xlsx”,里面的内容是这样的:
最终效果可以先了解一下,我们在unity中点击工具:
后面如果不需要增加表格或增加表格的列的话就不需要再使用工具了,接下来可以写个按钮事件来测试效果:
public void onclick()
{
int id = 1;
Tab_Tasks tasks = TableManager.GetTasksById(id);
if (tasks == null)
{
return;
}
Debug.Log("===" + tasks.Id + "===" + tasks.Name + "===" + tasks.Text);
Debug.Log("===" + tasks.Scene + "===" + tasks.Passed);
}
效果:
fine开搞,首先要拿到表格名字并生成相应的类,类中的成员变量要根据表格内容自动生成,那么首先得拿到每个表格路径,我们可以用个string类型的list来存储路径:
/// <summary>
/// 获取文件夹下的所有table路径
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static List<string> GetFilePathList(string path)
{
List<string> list = new List<string>();
string[] arr = Directory.GetFileSystemEntries(path);
for (int i = 0; i < arr.Length; i++)
{
if (File.GetAttributes(arr[i]).CompareTo(FileAttributes.Directory) > 0)
{
list.Add(arr[i]);
Debug.Log(arr[i]);
}
}
return list;
}
然后根据路径读取表格内容:
/// <summary>
/// 读取excel文件内容
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="columnNum">列数</param>
/// <param name="rowNum">行数</param>
/// <returns></returns>
public static DataRowCollection ReadExcel(string filePath, ref int columnNum, ref int rowNum)
{
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
//Tables[0] 下标0表示excel文件中第一张表的数据
columnNum = result.Tables[0].Columns.Count;
rowNum = result.Tables[0].Rows.Count;
return result.Tables[0].Rows;
}
根据表格的设定,第一行为变量名,第二行为类型,然后就可以开始生成类了,关于生成cs文件,我tm直接拼的:
/// <summary>
/// 生成“Tab_XXX”的类,每个表对应一个cs文件
/// </summary>
/// <param name="fileName">表格名称</param>
/// <param name="TableData">表格数据</param>
/// <param name="columnNum">表格列数</param>
public static void CreatNewClass(string fileName, DataRowCollection TableData, int columnNum)
{
string FileName = "Tab_" + fileName;
string FilePath = ExcelConfig.TableClassPath + FileName + ".cs";
StringBuilder sbCode = new StringBuilder();
sbCode.AppendLine("using System.Collections;");
sbCode.AppendLine("using System.Collections.Generic;")