[ 目录 ]
0. 前言
之前就在做的一个 unity 中使用的 Excel 导出工具,继续完善了一下,新增了枚举类属性的使用,另外提高了 demo 的完善度,增加了数据和代码的加载方式,以供参考。相关的代码以及Demo已经打包为Unity包,连接如下:
链接:https://pan.baidu.com/s/1llkwYZ7zEYN-TrZ4NRd8Fw?pwd=wsad
提取码:wsad
1. 功能
TableExporter 提供了一个由 Excel 表格导出为具体代码、数据的功能
- 支持多类型导出: bool,int,float,double,string,枚举类,Vector2,包括这几种基础类型对应的数组
- 导出类型可拓展: 可以非常方便的为表格添加基础属性之外的属性,比如 Vector3
- 支持多语言导出: 标记为多语言后将会额外导出为配置文件不用做额外处理
- 导出模板方便更改: 导出代码以及多语言等都是根据模板文本进行替换的,模板可以在 template.Asset 中进行更改,
- 支持多文件导出: 多份文件可以导出为一份数据以及代码,方便多人版本协作
2. 使用简介
简单讲一下使用方式,假设表格如下,表格 ForTest:
different | outputKey | ||
---|---|---|---|
Id | Property1 | Property2 | Property3 |
int | int | string | bool |
序号 | int 测试 | string 测试 | bool 测试 |
1 | 2 | str1 | FALSE |
2 | 3 | str2 | FALSE |
我们需要使用数据时,需要先导出。因为代码也已经导出,所以我们只需要处理数据加载,以及获取即可。
- (1)加载本地化字典,如果使用了如果使用了多语言(outputKey)的话 DataTableManager.Inst.LoadLocalizationDic(name)
- (2)加载表格数据 DataTableManager.Inst.LoadDataTable< type >()
- (3)获取表格 Id 对应的数据数据 table.GetData(1);
具体如下代码如下
// 加载数据
DataTableManager.Inst.LoadLocalizationDic("Default");
DataTableManager.Inst.LoadDataTable<DRForTest>();
// 获取数据
DataTable<DRForTest> table = DataTableManager.Inst.GetDataTable<DRForTest>();
DRForTest test1 = table.GetData(1);
Debug.Log("test1.Property1:" + test1.Property1);
Debug.Log("test1.Property2:" + test1.Property2);
这个时候就可以获取到表格中 Id=1 对应的 Property1、Property2 数据了。当然,是对应属性的,不至于都是 string
test1.Property1:2
test1.Property2:str1
更详细的使用方法可以看下文或者 demo 中的文件了
3. DEMO
demo 提供了基础的数据加载以及获取方式,并且相关路径已经在预制中配置完毕
- Data 数据导出以及导出内容
- Data/ExcelData:需要导出的表格
- Data/ExportCode:导出代码路径
- Data/ExportData:导出代码路径
- Data/ExportLang:多语言导出路径
- Scene 样例使用场景
- Sprite 游戏脚本
- Sprite/DataTableExtension 表格数据导出时会使用的函数
- Sprite/DataTableManager 用于正确加载并使用数据的代码
- Sprite/Demo 测试代码
demo 中 Scene 的 TestMono.cs 演示了数据的加载以及获取方法,可作为参考之用
demo 的相关数据以及导出路径,如果需要更改,需要到 TableExporter 对应的 Config.Asset 中进行更改,才可以正常使用
4. 编辑器菜单
导入后会多出一个菜单 MyTool/Table Export,其具体功能如下
-
开始导出工具:/Export
-
创建默认配置文件:/Create Asset/Create Config Asset
-
创建默认模板文件:/Create Asset/Create Template Asset
-
查看默认配置文件:/Selection Asset/Selection Config Asset
-
查看默认模板文件:/Selection Asset/Selection Template Asset
-
删除导出代码文件:/Clear Output/Clear Code
-
删除导出数据文件:/Clear Output/Clear Data
ExportorEditor 中规定了写了配置文件的位置。如果配置文件位置需要更改,要在 ExportorEditor 中去更改。
5. 配置
配置内容在 Config Asset,Template Asset 这两个文件中,通过 ScriptableObject 进行保存。目前讲一下基础的配置内容,其他项代表的内容,更改可以点对应的脚本,都有相对完善的注释。
Config Asset 主要配置内容为
- 表格文件加载路径 LoadPath
- 导出数据保存路径 SaveDataPath
- 导出代码保存路径 SaveCodePath
- 导出多语言保存文件 SaveOutputKeyFile
- 数组属性分隔字符串 PropertyArrSplitChar
Template Asset 主要配置内容为
- 代码模板 CodeTemplate
- 导出代码文件名字 CodeFileName
- 导出数据文件名字 DataFileName
6. 约定表格格式
支持多个文件配置同一个类,只需要为同名 sheet 即可,但需要属性项保持一致(所在列可以不一致)
表格的配置格式如下,样例可以看看 Demo 中的 Execl 文件
表格对应 | 表格内容 | |||
---|---|---|---|---|
1.设置项 | different | outputKey | ||
2.属性名 | Id | NextId | MapType | Name |
3.属性类型 | int | int | int | string |
4.属性注释 | 序号 | 下一个序号 | 地图类型 | 名字 |
5.数据行 1 | 1 | 2 | 1001 | 射击引导 |
n.数据行… | 2 | 3 | 1002 | 方块引导 |
- 设置项
可以为空或者其他,则没有限制
如果为 different,则要求此属性的所有属性值不能重复,否则将报错
如果为 outputKey,则此属性将会导出为 key,并导出到多语言 xml 中 - 属性类型
可以处理 bool,int,float,double,string,枚举类,Vector2,还有对应的数组比如 bool[]
属性值在导出的时,会按照属性类型会进行一个检查,如果错误将报错
属性值不填时,bool 默认为 false,int\float\double 默认为 false,string 为"",数组默认为 0 长度数组.
7. 导出属性拓展
如果需要新属性,可参考 Vector2 的拓展,可见 Vector2Property.cs
(1). 创建属性类并实现,Vector2Property
首先我们需要一个属性类来表示这个属性,需要继承 Property 类,而名字需要为属性名+Property。在属性类中我们需要定义:
- 属性的格式检查方式,如果不满足格式将报错
- 表格为空(空字符“”)时的替换方式
- 导出代码时属性解析方法
- 导出代码时属性数组解析方法
比如 Vector2,导出时会通过反射去获取 Exportor.Vector2Property 类来新建这个类,所以不用再在额外配置。
此时数据的内容导出已经完成了,但为了导入时可使用,我们还需要将"属性解析方法",“属性数组解析方法”,这两个方法是需要再主程序中使用的,所以需要注意是在 Editor 文件夹之外
// 属性类
// Vector2Property.cs
internal class Vector2Property : Property
{
protected override bool OnFormatCheck(string content)
{
string[] temp = content.Split(",");
bool flag = false;
float tempFloat;
if (temp.Length == 2 &&
float.TryParse(temp[0], out tempFloat) &&
float.TryParse(temp[1], out tempFloat))
{
flag = true;
}
return flag;
}
public override string OnEmptyReplace()
{
return "0,0";
}
public override string GetParseFunc()
{
return "DataTableExtension.ParseVector2";
}
public override string GetArrParseFunc()
{
return "DataTableExtension.ParseVector2Arr";
}
}
(2). 实现属性解析方法
负责做字符串到这个属性的转化
// Parse 函数
// DataTableExtension.ParseVector2
public static Vector2 ParseVector2(string text)
{
string[] temp = text.Split(",");
float x, y;
if (temp.Length == 2 &&
float.TryParse(temp[0], out x) &&
float.TryParse(temp[1], out y))
{
return new Vector2(x, y);
}
else
{
return Vector2.zero;
}
}
(3). 实现属性数组解析方法
负责做字符串到这个属性数组的转化
// 数组 Parse 函数
// DataTableExtension.ParseVector2Arr
public static Vector2[] ParseVector2Arr(string text)
{
string[] texts = ParseStringArr(text);
int length = texts.Length;
Vector2[] arr = new Vector2[length];
for (int i = 0; i < length; i++)
{
arr[i] = ParseVector2(texts[i]);
}
return arr;
}
8. 结束咯
到这里基本的介绍就结束了,希望能够有所作用。