Excel 配表规则
Fink Framework 的数据管线约定了一套 统一、严格且易用 的 Excel 配表规范。
遵循本规则可确保:
- 自动生成的数据类结构清晰、无歧义
- QA 校验顺利通过
- 运行时读取稳定可靠
- 支持复杂字段类型(数组、列表、字典、结构体、Vector、Color 等)
如果你希望让策划、程序都能轻松维护数据,这一章将是必读内容。
1. Excel 表格位置要求
所有 Excel 文件必须放在: 项目根目录/FinkFramework_Data/DataTables (Assets目录上一级即为项目根目录)
支持任意子文件夹,例如: 项目根目录/FinkFramework_Data/DataTables/Test/TestData.xlsx等
工具会自动递归扫描全部 .xlsx 文件。
2. 表格基础结构
每张 Excel 的前三行必须严格遵循以下结构:
| 行号 | 内容 | 描述 |
|---|---|---|
| 第 1 行 | 变量名 | 映射到 C# 字段名(必须合法) |
| 第 2 行 | 变量类型 | DataParseTool 自动解析 |
| 第 3 行 | 注释(可空) | 生成说明注释 |
| 第 4 行起 | 数据行 | 每一行 = 1条数据 |
3. 字段名规则(第 1 行)
必须满足:
- 只能包含字母 / 数字 / 下划线
- 不允许空字段名
- 不允许重复字段名
- 不允许以数字开头
- 不允许使用 C# 关键字(如
class、namespace)
错误示例:
| 字段名 | 原因 |
|---|---|
| dmg% | 包含非法字符 |
| 1level | 数字开头 |
| item-name | 包含 - |
若命名不规范,QA 会直接报错。
框架会对部分字段名自动清洗,例如:
- 去除空格
- 修正非法字符(TextsUtil 工具负责)
4. 字段类型规则(第 2 行)
Fink Framework 支持非常丰富的字段类型,包括:
- C# 全基础类型
- Unity 常用类型
- 数组、List
- 字典 Dictionary
- 自定义结构体
- 嵌套结构
框架会基于字符工具自动清洗所有中文符号。
下面将所有可用类型按类别拆分,并提供可折叠说明。
基础类型(Primitive Types)
框架支持 Excel 中填写所有 C# 常见基础类型:
| 类型 | Excel 示例 |
|---|---|
| int | 100 |
| float | 1.5 |
| double | 3.1415 |
| long | 9999999999 |
| bool | true/false、0/1 |
| string | Wood |
| short | 12 |
| ushort | 12 |
| byte | 255 |
| sbyte | -10 |
| uint | 123 |
| ulong | 12345 |
| decimal | 9.99 |
| char | A |
DateTime 类型
支持多种 Excel 时间格式:
| Excel 写法 | 解析效果 |
|---|---|
2024-01-01 | DateTime |
2024/01/01 12:30:00 | DateTime |
2024年1月1日 8:00 | DateTime(自动清洗) |
2024-01-01T12:00:00 | DateTime |
注意:
系统会自动清洗换行、中文符号、全角符号。
Unity 类型(Vector/Color/Matrix)
支持 Unity 常用的结构类型:
| 类型 | Excel 示例 |
|---|---|
| Vector2 | (1,2) |
| Vector3 | (1,2,3) |
| Vector4 | (1,2,3,4) |
| Color | (1,0.5,0,1) 或 #FFAA33 |
| Matrix4x4 | 见下方折叠示例 |
点击展开查看 Matrix4x4 Json填写格式
{
"m00": 1, "m01": 0, "m02": 0, "m03": 0,
"m10": 0, "m11": 1, "m12": 0, "m13": 0,
"m20": 0, "m21": 0, "m22": 1, "m23": 0,
"m30": 0, "m31": 0, "m32": 0, "m33": 1
}
说明:
- 系统会自动清洗所有空格、中文逗号等
- Color 支持 0~1 格式与 Hex 格式
- Matrix4x4 必须按照json格式填写
数组与 List<T>
数组与 List 写法完全一致,区别在于字段类型不同。理论上支持以上所有类型的数组与列表。
下方以几个常用类型进行举例。
数组示例
| 类型 | Excel |
|---|---|
| int[] | 1,2,3 |
| float[] | 1.2,3.5 |
| string[] | A,B,C |
| Vector3[] | (1,2,3),(2,3,4) |
List 示例
| 类型 | Excel |
|---|---|
| List<int> | 1,3,5,7 |
| List<string> | A,B,C |
分隔符规则
- 简单数组使用逗号分隔即可
- 多结构体(如Vector)数组单条数据用括号包裹,多条用逗号分隔
- 其余复杂类型如嵌套类自定义类等均使用标准Json格式
- Excel 单元格不能换行
- 系统会自动清洗所有空格、中文逗号等
Dictionary<TKey, TValue>
支持任意键值对结构,包括基础类型、Unity常用类型、自定义类和嵌套多层类等。
以下对每种情况举几个典型示例。
基础键值对示例:Dictionary<string,int>
{
"speed": 100,
"attack": 50
}
多结构字典:Dictionary<string,Vector3>
{
"pos1": { "x": 1, "y": 2, "z": 3 },
"pos2": { "x": 2, "y": 1, "z": 0 }
}
基础数组字典:Dictionary<string,int[]>
{
"enemy1": [1, 2, 3],
"enemy2": [4, 5, 6]
}
分隔符规则
- 字典类型均建议使用标准Json格式
- 系统会自动清洗所有空格、中文逗号等。
自定义数据结构类
表格中允许填写自定义的数据结构类,但数据只能通过Json形式进行存储。
自定义数据类定义示例:
class DropItem {
int id;
int count;
}
表格中自定义数据类型示例:DropItem
{
id:1001,
count:3
}
自定义结构体数组:List<DropItem>/DropItem[]
[
{ id:1,count:2 },
{ id:3,count:5 }
]
字典示例:Dictionary<string, DropItem>
{
rewardA:{ id:1001, count:2 },
rewardB:{ id:1002, count:5 }
}
所有结构体字段会按照字段类型继续递归解析。
嵌套结构(结构体 + 字典 + 数组 任意组合)
框架完全支持任意层级的嵌套组合结构。 这里我们以一个统一的自定义结构体作为示例:
示例数据类
class DropInfoData {
int id;
int value;
}
基于此结构,你可以在 Excel 中填写任意层级的嵌套 JSON,框架能够完全解析。例如:
字典嵌套结构体:Dictionary<string, DropInfoData>
{
"drop": { "id": 1, "value": 5 }
}
数组中包含结构体:DropInfoData[]
[
{ "id": 1, "value": 2 },
{ "id": 3, "value": 4 }
]
字典嵌套字典 + 数组:Dictionary<string, Dictionary<string, DropInfoData[]>>
{
"outer": {
"floor1": {
"drops": [
{ "id": 1, "value": 2 },
{ "id": 2, "value": 3 }
]
},
"floor2": {
"drops": [
{ "id": 5, "value": 9 }
]
}
}
}
这些都会在生成类与解析阶段被完整处理。
5. 注释规则(第 3 行)
- 可留空
- 会自动在生成的代码类中写明注释(如
/// <summary>注释</summary>) - 不建议使用
{ } : , ;等特殊字符
6. 数据行(第 4 行起)
每一行映射为:items[i]
规则:
- 空行自动跳过
- 空字段 → 使用默认值
- 类型不匹配 → QA 报错
- 自动进行 中文字符 清洗
7. 不支持的情况
| 格式 | 错误原因 |
|---|---|
(1,2 | 括号不完整 |
1,,2 | 多余逗号 |
{id:1 count:2} | 缺少逗号 |
| 单元格换行 | 不允许 |
8. 示例完整表格
表格 1:TestData.xlsx
| id | name | damage | tags | pos | color | drop | drops | stats | extra | nested | items | dictList |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| int | string | int[] | string[] | Vector3 | Color | DropInfoData | DropInfoData[] | Dictionary<string,int> | Dictionary<string,Vector3> | Dictionary<string,DropInfoData[]> | List<int> | Dictionary<string,List<int>> |
| 唯一ID | 名称 | 伤害数组 | 标签 | 位置 | 颜色 | 单个掉落 | 多个掉落 | 属性表 | 坐标表 | 多层嵌套掉落 | ID列表 | 字典数组 |
| 1 | Wolf | 10, 20, 30 | A, B, C | (1, 2, 3) | #FFAA33 | { "id":1001, "value":5 } | [ {"id":1,"value":2}, {"id":2,"value":5} ] | {"atk":10,"def":5} | {"p1":{"x":1,"y":1,"z":1},"p2":{"x":2,"y":2,"z":2}} | {"boss":[{"id":5,"value":9}],"elite":[{"id":2,"value":3}]} | 1, 3, 5, 7 | {"group1":[1,2,3],"group2":[4,5]} |
| 2 | Goblin | 5, 6 | X, Y | (2, 3, 4) | (0, 1, 0, 1) | { "id":1002, "value":1 } | [ {"id":5,"value":1}, {"id":8,"value":2} ] | {"atk":4,"def":1} | {"p1":{"x":5,"y":5,"z":1}} | {"floor1":[{"id":1,"value":1}]} | 2, 4 | {"teamA":[9],"teamB":[8,7]} |
表格 2:DropInfoData.xlsx
| id | value |
|---|---|
| int | int |
| 掉落ID | 对应数值 |
| 1 | 5 |
| 2 | 10 |
| 3 | 20 |
将这两个.xlsx文件放入Assets/Data/Test文件夹下。
在数据工具面板中点击:一键处理全部数据 按钮。
运行后会生成:
- 表格文件名.cs
- 表格文件名 + Container.cs
- 加密二进制文件
- JSON 模板文件
在任意脚本中,你可以使用以下代码轻松访问数据(必须通过数据容器类的泛型访问):
var testDataContainer = FilesUtil.LoadDefaultData<TestDataContainer>();
获取数据容器后,即可从变量获取任意数据源。表格从第四行起为数据行,对应items的索引号。
推荐使用IDE自带的断点调试功能来测试数据是否获取正确。
也可使用框架自带的LogUtil来代替Unity的Debug/print来简单测试数据。详情请见日志工具
LogUtil.Info(testDataContainer.items[0].name);
LogUtil.Info(testDataContainer.items[0].id.ToString());
LogUtil.Info(testDataContainer.items[0].drop.id.ToString());
若分别打印Wolf、1、1001 则为成功。