用处:
通过表格管理与配置自定义数据类型,实现编辑器外表格配置,编辑器内json/二进制存储,运行时读取与构建索引。

优势:
支持Json/Bytes两种格式的序列化存储方式。Json利于调试,Bytes存储占用小、序列化速度快。
支持Debug数据导出。
支持增量导出,无需每次都导出所有表格。
缺点(待完善):
EPPlus只支持.xlsx文件,不支持.xls
如果一个表数据页有10w条数据,仅读取Define表页也会十分耗时。
不支持数据热重载
无C#代码生成
时间戳作为增量比对依据并不完全准确,版本管理等因素可能改变时间戳
插件:
EPPlus-LGPL.dll v4.5.3.13 :读取.xlsx表格数据(缺点:不支持.xls)
Newtonsoft.Json : 将数据序列化为Json格式
MessagePack.dll:将数据序列化为二进制格式(占用小,读取快)
规范:
表格:
表格文件拓展名必须为.xlsx
表格文件需要放在Assets的父目录下的Data文件夹中(Assets/../ExcelData)
表格文件必须包含一个名为Define的表页
Define表页的第二行前四列分别输入 数据表页名|数据类型名|成员字段所在行|值起始行
自定义数据类型的索引值不能重复
程序端:
表中的自定义数据类型必须继承IExcelObject接口
自定义数据类型中需要用[Ib_Key]来标识索引主键
[Ib_Key]只能作用于int和string类型,支持同时拥有int和string两种主键。
编辑器中数据存储位置必须在Resources文件夹下
MessagePack:
使用Binary二进制(MessagePack)存储时,所有表格中的自定义数据类型都需要加[MessagePackObject],每个成员变量前需要加[Key(0)]、[Key(1)],手动规划序列化顺序。不需要序列化的加[IgnoreMember]
表格特性:
[Ignore] : 用于表定义的表名/数据字段名,添加此特性的条目会被跳过,不被解析。
[Debug] : 用于数据字段名,使用Debug模式导出会覆盖非Debug同名字段数据。
[Trim] : 用于数据字段名,去除输入值的收尾空格。
[Required] :用于数据字段名,导出时检查该数据是否为空,若空则强制报错。
更新日志:
2026-06-24 v0.1 : 缓存数据、优化反射性能,导出速度提升约20%。50万条数据导出41s -> 32s。
2026-07-09 v0.2 : 增加导出/使用说明编辑器窗口。
2026-07-13 v0.21 : 导出时获取目标文件夹/子文件夹下所有.xlsx文件。支持自定义导出:可勾选需要导出的文件,支持以文件为颗粒度的正常/Debug导出模式调整。
2026-07-13 v0.3 : 支持增量导出。导出时每个表单独导出一份Bytes文件,将所有信息记录在ExcelDataManifest中。增量导出:导出前比对manifest中记录的信息,如果导出文件/源文件/导出参数未更改,则跳过导出。
2026-07-24 v0.4 : 使用enum为key在构建索引时会被映射为int。修复新表第一次导出AA无法找到的问题。增加int => bool的数据映射。增加有格式但无数据行的跳过判断。
2026-08-25 v0.5 : 增加数据范围校验
核心流程:

1、Ib_ExcelExporter(编辑器阶段)
获取目标文件路径下所有包含Define定义页的.xlsx文件

获取导出manifest文件,里面记录了各个导出/源文件的时间戳,通过当前源文件.xlsx/导出文件.byte的时间戳,导出文件是否存在,导出模式等参数比对,判断是否文件有改动,未改动则跳过,增量导出。

开始读取表格,获取定义页Define,读取目标表页的表头行

按短名查找获取表页对应数据的类型,遍历所有数据行,反射实例化类型实例赋值
[MessagePackObject(true)]
public class GridTileDataConfig : IExcelObject
{
/// <summary>图块类型,作为主键索引</summary>
[Ib_Key]
public GridTileType TileTypeKey;
/// <summary>图块基础血量。0 表示不可破坏。</summary>
public int Hp;
/// <summary>是否不可破坏(true=不可破坏)。不可破坏的图块无法被光点/孢子攻击。</summary>
public bool IsIndestructible;
/// <summary>是否为障碍物(1=是,0=否)。障碍物区域不可生长通过。</summary>
public int IsObstacle;
/// <summary>是否为一次性资源(1=是,0=否)。触碰后一次性给予奖励并消失。</summary>
public int IsOneTime;
/// <summary>一次性资源的奖励数值下限(含)。</summary>
public int MinOneTimeReward;
......
}

数据范围校验,未通过校验直接报错并结束流程
数据序列化为二进制文件,打上AA标记,一个表对应一个文件,将时间戳、加载路径等信息写入manifest文件

2、Ib_ExcelLoader(运行时)
异步加载manifest,获取所有表数据的导出文件AA地址并异步加载
反序列化获取数据实例,按数据名合并为统一数据集
根据类型的索引类型(Type/int/string)在Ib_DataProvider中构建对应的索引
3、Ib_DataProvider(运行时)
对外提供按类型、整型主键、字符串主键的查询接口
public static GridTileDataConfig GetTileConfig(GridTileType type)
{
return Ib_DataProvider.Default.GetConfig<GridTileDataConfig>((int)type);
}
评论(0)
暂无评论