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# 关键字(如 classnamespace

错误示例:

字段名原因
dmg%包含非法字符
1level数字开头
item-name包含 -

若命名不规范,QA 会直接报错。
框架会对部分字段名自动清洗,例如:

  • 去除空格
  • 修正非法字符(TextsUtil 工具负责)

4. 字段类型规则(第 2 行)

Fink Framework 支持非常丰富的字段类型,包括:

  • C# 全基础类型
  • Unity 常用类型
  • 数组、List
  • 字典 Dictionary
  • 自定义结构体
  • 嵌套结构

框架会基于字符工具自动清洗所有中文符号。
下面将所有可用类型按类别拆分,并提供可折叠说明。

基础类型(Primitive Types)

框架支持 Excel 中填写所有 C# 常见基础类型:

类型Excel 示例
int100
float1.5
double3.1415
long9999999999
booltrue/false、0/1
stringWood
short12
ushort12
byte255
sbyte-10
uint123
ulong12345
decimal9.99
charA
DateTime 类型

支持多种 Excel 时间格式:

Excel 写法解析效果
2024-01-01DateTime
2024/01/01 12:30:00DateTime
2024年1月1日 8:00DateTime(自动清洗)
2024-01-01T12:00:00DateTime

注意:
系统会自动清洗换行、中文符号、全角符号。

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
idnamedamagetagsposcolordropdropsstatsextranesteditemsdictList
intstringint[]string[]Vector3ColorDropInfoDataDropInfoData[]Dictionary<string,int>Dictionary<string,Vector3>Dictionary<string,DropInfoData[]>List<int>Dictionary<string,List<int>>
唯一ID名称伤害数组标签位置颜色单个掉落多个掉落属性表坐标表多层嵌套掉落ID列表字典数组
1Wolf10, 20, 30A, 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]}
2Goblin5, 6X, 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
idvalue
intint
掉落ID对应数值
15
210
320

将这两个.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());

若分别打印Wolf11001 则为成功。