[编程工具]Unity配表导出工具TableExporter

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:

differentoutputKey
IdProperty1Property2Property3
intintstringbool
序号int 测试string 测试bool 测试
12str1FALSE
23str2FALSE

我们需要使用数据时,需要先导出。因为代码也已经导出,所以我们只需要处理数据加载,以及获取即可。

  • (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.设置项differentoutputKey
2.属性名IdNextIdMapTypeName
3.属性类型intintintstring
4.属性注释序号下一个序号地图类型名字
5.数据行 1121001射击引导
n.数据行…231002方块引导
  • 设置项
    可以为空或者其他,则没有限制
    如果为 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. 结束咯

到这里基本的介绍就结束了,希望能够有所作用。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值