[编程工具]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:

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. 结束咯

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

猜你喜欢

转载自blog.csdn.net/Blue_carrot_/article/details/130954127