数据库
六类数据库,一条规则:不在 GameCardManager 启用数据库里的内容,对 Workbench 和运行时查询都是不可见的。
适合遇到「卡牌明明在磁盘上,却不出现在选择器、搜索或战斗里」的人。数据库是 GCS 找到你内容的方式。工作台(Workbench)从场景的 GameCardManager 读取启用的数据库,运行时查询走的也是同一批列表。一个资产如果只存在于磁盘上、不属于任何启用的数据库,对两边都是不可见的。绝大多数「我的内容不显示」最终都归结到这里。

六类数据库
| 数据库 | 内容 |
|---|---|
GameCardDatabase | GameCard 资产 |
GameDeckDatabase | GameDeck 资产 |
GamePlayerUnitDatabase | GamePlayerUnit 资产 |
GameEnemyUnitDatabase | GameEnemyUnit 资产 |
GameStatusDatabase | GameStatus 资产 |
GameEncounterDatabase | GameEncounter 资产 |
每个 Workbench 模式列出的都是对应类型启用数据库里的条目:Card 模式读卡牌数据库,Deck 模式读卡组数据库,依此类推。
每个数据库资产本身也有 Inspector:它会显示一份 Summary,按类型和稀有度统计库里的条目,并给出一个 Open in Card Mode 快捷入口,直接跳进 Workbench:

注册与启用开关
选中场景的 GameCardManager 来注册数据库。它的 Inspector 按类型分成六个区块,顺序是:Card、Deck、Player Unit、Enemy Unit、Status、Encounter。每个区块有三种注册方式:
| 操作 | 作用 |
|---|---|
| + Add | 弹出下拉列表,列出项目里该类型所有尚未注册的数据库资产。选一个,立即注册并启用。 |
| + New | 在 GCS 用户数据文件夹里新建一个数据库资产,并一步注册启用。 |
| 拖放 | 把一个或多个数据库资产从 Project 窗口拖到区块上。 |
每个已注册的数据库显示为一行,带 Active 启用开关、一个定位按钮(在 Project 窗口 ping 该资产)和一个移除按钮。移除只是从这个 manager 上取消注册,资产仍在磁盘上,之后可以重新添加。双击行内名称可以就地重命名资产。
只有启用的数据库才会供给 Workbench 和运行时查询。注册了但没启用的数据库,其内容藏得和从未注册一样彻底。区块标题栏会如实记账:显示已注册数据库里有几个处于启用状态、共贡献多少条目,1/2 Active 就说明有一个数据库当前是暗的。

一次普通的战斗测试需要 manager 上六类数据库各有一个处于启用状态。System Dashboard 一键就能填满:它注册 Demo/Databases/ 下的六个预设数据库;那个按钮具体创建了什么,见 Manager 与 Bootstrap。
战斗开始时,状态机会绑定第一个启用的状态数据库、卡牌数据库和敌方单位数据库,用于战斗内查询。如果同类数据库启用了多个,把战斗实际依赖的那个放在 manager 列表的最前面。
用多个数据库组织内容
把内容拆进多个数据库是创作上的选择,不是硬性要求。常见拆法:
| 拆分维度 | 示例 |
|---|---|
| 归属 | Demo 卡牌数据库与项目卡牌数据库分开 |
| 职业 | Warrior 卡、Mage 卡、Hunter 卡、Priest 卡 |
| 章节 | Act 1 敌人、Act 2 敌人、boss 遭遇战 |
| 测试范围 | 小型测试卡组和遭遇战与生产内容隔离 |
启用集合要有明确意图。把所有实验数据库都在每个场景里启用,会增加搜索噪音,也会掩盖错误:一个失效引用可能解析到你没有计划发布的内容上。
从代码读取启用内容
GCSApi 同时提供启用数据库列表和跨库拍平后的内容:
using TinyGiants.GCS.Runtime;
// Active database lists (never null)
var cardDbs = GCSApi.ActiveCardDatabases();
var deckDbs = GCSApi.ActiveDeckDatabases();
var statusDbs = GCSApi.ActiveStatusDatabases();
// Every entry across the active databases of a type
var cards = GCSApi.Cards();
var decks = GCSApi.Decks();
var statuses = GCSApi.Statuses();
var encounters = GCSApi.Encounters();
var players = GCSApi.PlayerUnits();
var enemies = GCSApi.EnemyUnits();
每个内容方法都会遍历启用数据库并新分配一个列表,所以每帧或每次 UI 刷新都要读的话,请缓存结果。
缺注册的典型症状
| 症状 | 大概率缺的是 |
|---|---|
| Workbench Card 模式空空如也 | 没有启用的卡牌数据库 |
| 新卡永远抽不到 | 缺卡牌或卡组数据库,或者这张卡不在卡组里 |
| 状态施加不上 | 没有启用的状态数据库,或库里没有这个状态 |
| 遭遇战选择器里什么都没有 | 没有启用的遭遇战数据库 |
| 选择器里找不到某个敌人 | 没有启用的敌方单位数据库 |
| 玩家单位选择器为空 | 没有启用的玩家单位数据库 |
生产内容用自己的数据库
不要把游戏内容直接长在 demo 数据库里。创建项目自有的数据库,预设数据库保持原样。新建有两条路:
- manager 上的 + New 按钮,资产会放进 GCS 用户数据文件夹(默认
Assets/TinyGiantsData/GameCardSystem/;这个文件夹可以移到Assets/下任何位置,引用不会断)。 - Unity 的资产菜单,在 Project 窗口当前位置直接创建:
Assets > Create > TinyGiants > GCS > Card Database
同一菜单下六类数据库都有。在你的游戏场景里注册自己的数据库,把预设留作已知可用的参照:自定义配置出问题时,和预设注册对照一下,差异通常几分钟就能找出来。
测试遭遇战前的检查清单
- 遭遇战在某个启用的遭遇战数据库中。
- 它的玩家单位在某个启用的玩家单位数据库中。
- 玩家单位的初始卡组在某个启用的卡组数据库中。
- 卡组里的每张卡都在某个启用的卡牌数据库中。
- 卡牌或敌人会施加的每个状态都在某个启用的状态数据库中。
- 遭遇战里的每个敌人都在某个启用的敌方单位数据库中。
绝大多数「内容存在但不显示」都是注册问题,而这份清单比进 Play Mode 找得快。