跳到主要内容

数据库

GCS · Setup

六类数据库,一条规则:不在 GameCardManager 启用数据库里的内容,对 Workbench 和运行时查询都是不可见的。

适合遇到「卡牌明明在磁盘上,却不出现在选择器、搜索或战斗里」的人。

数据库是 GCS 找到你内容的方式。工作台(Workbench)从场景的 GameCardManager 读取启用的数据库,运行时查询走的也是同一批列表。一个资产如果只存在于磁盘上、不属于任何启用的数据库,对两边都是不可见的。绝大多数「我的内容不显示」最终都归结到这里。

Workbench 的 Deck 模式:列出启用卡组数据库中的卡组,右侧打开卡组 Inspector 和预览

六类数据库

数据库内容
GameCardDatabaseGameCard 资产
GameDeckDatabaseGameDeck 资产
GamePlayerUnitDatabaseGamePlayerUnit 资产
GameEnemyUnitDatabaseGameEnemyUnit 资产
GameStatusDatabaseGameStatus 资产
GameEncounterDatabaseGameEncounter 资产

每个 Workbench 模式列出的都是对应类型启用数据库里的条目:Card 模式读卡牌数据库,Deck 模式读卡组数据库,依此类推。

每个数据库资产本身也有 Inspector:它会显示一份 Summary,按类型和稀有度统计库里的条目,并给出一个 Open in Card Mode 快捷入口,直接跳进 Workbench:

Game Card Database 资产的原生 Inspector:Card Database 标题、资产路径,以及按卡牌类型和稀有度统计条目的 Summary


注册与启用开关

选中场景的 GameCardManager 来注册数据库。它的 Inspector 按类型分成六个区块,顺序是:Card、Deck、Player Unit、Enemy Unit、Status、Encounter。每个区块有三种注册方式:

操作作用
+ Add弹出下拉列表,列出项目里该类型所有尚未注册的数据库资产。选一个,立即注册并启用。
+ New在 GCS 用户数据文件夹里新建一个数据库资产,并一步注册启用。
拖放把一个或多个数据库资产从 Project 窗口拖到区块上。

每个已注册的数据库显示为一行,带 Active 启用开关、一个定位按钮(在 Project 窗口 ping 该资产)和一个移除按钮。移除只是从这个 manager 上取消注册,资产仍在磁盘上,之后可以重新添加。双击行内名称可以就地重命名资产。

只有启用的数据库才会供给 Workbench 和运行时查询。注册了但没启用的数据库,其内容藏得和从未注册一样彻底。区块标题栏会如实记账:显示已注册数据库里有几个处于启用状态、共贡献多少条目,1/2 Active 就说明有一个数据库当前是暗的。

GameCardManager 的六个数据库区块,带 + New 和 + Add 控件,每个标题栏都显示 1/1 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 找得快。