跳到主要内容
Data 与 Schema

本页尚未翻译,当前显示英文版本。

搭建游戏 Schema

最后更新:2026 年 7 月 16 日

Schema 的核心概念理清之后,下一步就是动手搭建结构本身。

所有对象都住在 Schema 视图里 —— Entity、Part 和 Enum 都列在侧边栏中。选中任意一个对象,主面板就会打开它的字段和配置。

带有 ENTITIES、PARTS 和 ENUMS 分区的空 Schema 视图


先搭结构,再填 Record

在添加任何数据之前,先把模型的形状定下来。搭建顺序选得好,过程会顺畅得多 —— 后建的对象往往依赖先建的,而一个字段没法引用或嵌入一个还不存在的东西。

先建 Enum

Enum 定义了你的字段将要引用的固定取值集合。把它们放在最前面建好,等你开始给 Entity 和 Part 加字段时就能直接用上。

例如:TankStatus、WeaponType、ArenaSize。

定义 Entity Part

Entity Part 是可复用的结构片段。要在那些将会包含它们的 Entity 之前定义好,这样 Inclusion 字段才能立刻指向它们。

例如:TankConf、BattleConf、ConnectionConf。

创建 Entity

Entity 是拥有自己 Record 的顶层独立对象。到这一步 Enum 和 Part 都已就位,字段可以马上引用和包含它们。

例如:Tanks、Leaderboards、ActiveGames。

添加字段并连接对象

所有对象都建好之后,给 Entity 和 Part 添加字段。用 Relationship 字段把 Entity 连到其他 Entity,用 Inclusion 字段嵌入 Entity Part。

施加约束

结构稳定下来之后,再用约束把它收紧 —— Required、Unique、最小最大值、条目数量。只在这些约束反映真实规则时才加,别为了填满选项而加。

到 Data 视图里检查一遍

打开 Data 视图,建一条测试 Record。如果表单让人困惑,或者结构感觉别扭,问题通常出在 Schema 上 —— 在灌入真实数据之前先改好。

提示

第一版尽量简单。日后扩展一个干净的 Schema,通常比精简一个过度设计的 Schema 容易得多。


创建 Entity

当你需要一个拥有自己 Record 的完整独立对象时,就用 Entity。

在 Schema 视图中点击 + New 并选择 Entity,然后填写:

  • Name —— 对象名称,会贯穿整个 Schema 和 Data 视图
  • Description —— 可选,帮助团队其他成员理解这个对象的用途

Entity 对应你游戏中的一个真实概念 —— Player 档案、武器配置、对战记录,或是一个全局设置对象。如果这个对象应当在 Data 视图中作为独立 Record 存在,那它属于 Entity,而不是 Entity Part。


创建 Entity Part

当你想定义一段隶属于其他对象、可复用的结构片段时,就用 Entity Part。

点击 + New 并选择 Part,然后填写:

  • Name —— part 的名称
  • Description —— 可选

当同一组字段需要出现在多个 Entity 中,或者一个大 Entity 更适合由若干个有名字的小块拼起来时,Entity Part 就很有用。一个装着武器和装甲设置的 TankConf part,可以被 Tanks 包含,也能在任何需要同样结构的地方复用。

提示

如果这个对象应当住在另一个对象内部、而不是独立存在,那它属于 Entity Part。


创建 Enum

当某个字段只应接受预定义清单中的一个值时,就用 Enum。

点击 + New 并选择 Enum,然后填写:

  • Name —— enum 的名称
  • Values —— 允许的选项清单

Enum 最适合用于受控选项 —— 状态值、分类、类型。一个取值为 Active、Destroyed、Respawning 的 TankStatus enum,能保证那个字段里绝不会存进意料之外的值。

备注

取值应当来自固定清单时用 Enum;取值应当直接填写时用 Primitive。


给对象添加字段

Entity 或 Entity Part 建好之后,就定义它的字段。在对象面板里点击 + Add field。

每个字段都需要:

  • Name —— 字母、数字和下划线;必须以字母开头
  • Kind —— 这个字段存什么,以及它如何与其他对象相连

选对 kind

直接存放一个标量值。大多数直接装值的字段都用它 —— 一个名字、一个速度、一个开关、一个时间戳。

带类型选择器的 Primitive 字段 kind

直接存放一个标量值。大多数直接装值的字段都用它 —— 一个名字、一个速度、一个开关、一个时间戳。

带类型选择器的 Primitive 字段 kind

类型存放
Text短字符串
Long text多行字符串
Integer整数
Number浮点数 / 小数
Decimal定精度数
Booleantrue / false
Date & timeISO 时间戳
DateYYYY-MM-DD
UUID唯一标识符
JSON结构化对象
Email经校验的邮箱
URL链接

把字段限定为某个预定义 Enum 中的一个值。用于状态、分类,或任何取值集合固定的字段。

带 enum 选择器的 Enum reference 字段 kind

选定这个 kind 之后,再选择该字段引用哪个 Enum。这个字段只会接受那个 Enum 中定义过的值。

建立一个指向另一个 Entity 的外键。当当前对象应当指向一条独立存在的 Record 时使用。

带 entity 选择器和基数设置的 Relationship 字段 kind

选择目标 Entity 和基数:单个链接选 1-to-1,多个选 1-to-many。与 Inclusion 不同,Relationship 不会嵌入目标的结构,它只存一个指向对方的引用。

把一个 Entity Part 直接嵌进当前对象。当嵌套的结构隶属于父对象、不应独立存在时使用。

带 part 选择器和基数设置的 Inclusion 字段 kind

选择目标 Entity Part 和基数:嵌入单个实例选 1-to-1,嵌入一组选 1-to-many。与 Relationship 不同,Inclusion 会把 part 的字段直接插进父对象的结构里。

提示

结构隶属于该对象时,用 Inclusion。对象应当指向某个独立存在的东西时,用 Relationship。

所有类型和约束的完整参考,见 Schema Object Reference。


用 Singleton 表示唯一 Record

如果某个对象只应有一条 Record,就在创建或编辑该 Entity 时把它标记为 Singleton。

全局配置对象,或整个 Project 范围内唯一的设置,就用 Singleton。一个装着全服参数的 GameConfig entity 应当恰好存在一份 —— 而不是一长串 Record。

备注

普通 Entity 可以有很多条 Record,Singleton Entity 恰好只有一条。Data 视图会随之改变 —— 显示的不是 Record 列表,而是单个可编辑表单。


ER 图

Schema 视图中的 ER diagram 标签页,会实时展示所有对象及其连接关系的可视化地图。它直接由 Schema 推导而来,你增删或修改对象和字段时会自动更新 —— 不需要手工画。

展示 Entity、Part、Enum 及其 relationship 与 inclusion 连接的 ER 图

用 ER 图可以一眼审视整体结构、发现对象之间缺失的连接、确认基数设置是否正确,或是把模型分享给想了解数据设计、又不想逐个点开对象的同事。

对象类型

图中用不同颜色的节点表示三种 Schema 对象类型:

Entity

独立对象

顶层对象,在 Data 视图中拥有自己的 Record。会被其他对象引用或包含。

Part

可复用的片段

通过 Inclusion 字段嵌进 Entity 内部的结构片段,没有独立的 Record。

Enum

受控的取值集合

允许取值的固定清单。在整个 Schema 中通过 Enum reference 与字段相连。

连接类型

节点之间的连线表示对象如何相连。图中用三种线型,与 ER diagram 标签页右上角的图例一致:

连线线型连接的是
relationship实线Entity → Entity,经由 Relationship 字段
inclusion虚线Entity → Part,经由 Inclusion 字段
enum点线字段 → Enum,经由 Enum reference 字段

适用时连线上会标注基数 —— 用了该设置的 Relationship 和 Inclusion 连接上会出现 1-to-many。


常见的设计失误

该用 Inclusion 时用了 Relationship —— 如果嵌套的结构隶属于父对象、没有独立的生命周期,就用 Inclusion 把它嵌进去,而不是用 Relationship 连过去。

该用 Relationship 时用了 Inclusion —— 如果被关联的对象独立存在、并且可能被多处引用,就用 Relationship,而不是嵌一份副本进来。

定义又大又平的 Entity,而不用 Part 来组合 —— 当多个 Entity 共享同一组字段时,把这组字段抽成一个 Entity Part 再包含进来,别手工把字段复制好几遍。

警告

不要因为编辑器允许就往上堆复杂度。Relationship、Inclusion 和 Entity Part 只有在反映 Project 真实结构时才有价值。


下一步

更新于 2026年7月16日