很久之前写的一个工具,用于把excel导出为二进制文件,供游戏读取。
完整项目在我的github中:https://github.com/LiuFeng1011/Test/tree/master/Assets/ExcelTools
使用方法
将ExcelTools放在项目Assets文件夹中
创建配置表:
同一张表中可以有多个工作簿,第一行为注释,程序中不会读取,第二行为字段名,之后为内容。
制作好配置表后放入Asset/ExcelTools/xlsx文件夹中。
然后在ExcelTools/GameData/ConfigClass.cs中创建相应的配置表类,类名要与相应的配置表工作薄的名称相同,上面的表中就是ExcelATest1,ExcelATest2.
[Serializable]
public class ExcelATest1 : ConfigClass
{
public string id;
public string eat1_1;
public string eat1_2;
public int eat1_3;
}
[Serializable]
public class ExcelATest2 : ConfigClass
{
public string id;
public string eat2_1;
public string eat2_2;
public int eat2_3;
}
注意所有的配置表类需要加上[Serializable]。
之后需要创建存放导出的配置文件的文件夹,StreamingAssets/Config
然后点击菜单栏中的[配置表工具/生成配置表]
之后会看到文件选择窗口,窗口中会列出Asset/ExcelTools/xlsx中的全部文件
选择我们想要导出的配置表,如果没有问题,我们将看到导出成功的提示
这里会列出所有导出成功的工作薄,这时我们就可以在StreamingAssets/Config中看到我们的配置文件了
由于二进制文件使用起来比较方便,而且体积小,所以这里采用二进制文件来保存,如果不想用二进制,还可以使用xml等方式来存储,反正从excel读取出来都存在list里面,想怎么存储都很随意。
由于我们导出的是二进制文件,所以只能放在StreamingAssets文件夹下,并且使用的时候需要使用www的方式来加载。
项目中我写了一个测试脚本来测试数据:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
public class ReadTest : MonoBehaviour {
//key:表名 val 表数据列表
Dictionary<string, List<ConfigClass>> dic = new Dictionary<string, List<ConfigClass>>();
int loadStep = 0;
private void Start()
{
StartCoroutine(ReadConfigFile("ExcelATest1.msconfig"));
StartCoroutine(ReadConfigFile("ExcelATest2.msconfig"));
StartCoroutine(ReadConfigFile("ExcelBTest1.msconfig"));
}
void LogData(){
Debug.Log(JsonMapper.ToJson(dic["ExcelATest1.msconfig"][0]));
Debug.Log(JsonMapper.ToJson(dic["ExcelATest1.msconfig"][1]));
Debug.Log(JsonMapper.ToJson(dic["ExcelATest1.msconfig"][2]));
}
IEnumerator ReadConfigFile(string filename)
{
loadStep++;
string filepath = ExcelTool.GetConfigFilePath(filename);
WWW www = new WWW(filepath);
yield return www;
while (www.isDone == false) yield return null;
if (www.error == null)
{
byte[] data = www.bytes;
List<ConfigClass> datalist = (List<ConfigClass>)ExcelTool.DeserializeObj(data);
dic.Add(filename,datalist);
}
else
{
//GameLogTools.SetText("wwwError<<" + www.error + "<<" + filepath);
Debug.Log("wwwError<<" + www.error + "<<" + filepath);
}
loadStep--;
if(loadStep <= 0){
LogData();
}
}
}
将脚本挂到游戏物体上并运行场景,可以看到控制台的输出:
接下来就可以在我们的程序中使用这些数据了。