Manager 与 Bootstrap
每个 GCS 场景靠两个组件支撑:GameCardManager 持有已注册的数据库,GameCardEncounterBootstrap 决定按下 Play 时启动哪场遭遇战。
适合手动搭建战斗场景的人,也适合想弄清仪表盘 Initialize System 按钮到底创建了什么的人。每个 GCS 战斗场景的根基是一个挂着两个组件的 GameObject。GameCardManager 注册数据库,让你的内容可以被找到;GameCardEncounterBootstrap 选定遭遇战并启动它。两者任何一个缺失或指向错误内容时,场景加载不会报错,然后什么都不会发生,所以有必要弄清每个部件到底负责什么。
两个组件,一个 GameObject
| 组件 | 职责 |
|---|---|
GameCardManager | 持有六类数据库列表及各自的启用开关,提供运行时内容查询,并拥有 StartBattle。每个场景一个,可通过 GameCardManager.Instance 访问 |
GameCardEncounterBootstrap | 保存场景的 Default Encounter,在 Auto Start On Play 启用时于 Play 启动它。要求同一 GameObject 上存在 GameCardManager |
场景里的其他一切(相机、手牌 UI、单位区域、HP 条)都属于表现层。战斗场景会讲那些部件;本页只讲让战斗得以存在的这两个组件。
让仪表盘替你搭好
最快且不会出错的方式只需一个按钮。从 Tools/TinyGiants/GCS/Game Card System 打开仪表盘,点击 Initialize System。

这个按钮会在当前打开的场景里做四件具体的事:
- 查找
GameCardManager;找不到就创建一个名为GameCardManager的 GameObject 并挂上该组件。 - 若缺少
GameCardEncounterBootstrap,在旁边补上一个。 - 注册
Demo/Databases/下的六个预设数据库,并全部标记为启用。 - 选中该 GameObject,方便你立即检查结果。

Initialize System 只补缺。你自己注册的数据库不会被动到,已注册的预设也不会重复添加。六类数据库都就位后,按钮会变为已初始化状态。
Bootstrap 逐字段说明
| 字段 | 含义 |
|---|---|
Default Encounter | 本场景要启动的遭遇战。Inspector 会把它显示成一张卡片,标出该遭遇战的玩家单位和敌人数量,便于确认选择是否正确 |
Auto Start On Play | 默认开启。启用时,进入 Play Mode 的瞬间自动开始该遭遇战 |
On Bootstrap | 战斗启动后立即触发的 UnityEvent。适合做场景级反应,比如播放音乐或隐藏加载遮罩 |

选遭遇战时,点卡片上的选择图标(或直接双击卡片),会弹出一个搜索列表,列出项目里的全部遭遇战。旁边两个图标分别用来在 Project 窗口定位该资产、以及清空当前选择。
Inspector 还会在遭遇战卡片下方显示一行状态提示。按 Play 之前先检查:
| 状态提示 | 含义 |
|---|---|
| Ready,Play 即启动 | 遭遇战已指定,且能通过某个启用的遭遇战数据库找到 |
| 请选择遭遇战,或关闭 Auto Start On Play | 自动启动已开启但没有指定遭遇战。进入 Play Mode 只会记录一条警告,什么都不启动 |
| 所选遭遇战不在任何启用的 EncounterDatabase 中 | 资产存在,但 manager 看不见它。注册包含它的数据库,或把该数据库的启用开关打开 |
| 没有注册启用的 Encounter Database | manager 完全没有遭遇战数据库。运行 Initialize System,或注册你自己的 |
Auto Start On Play 开着而 Default Encounter 为空时,GCS 会在 Play 时记录一条警告并直接跳过启动。场景看起来一切正常,就是没有战斗。状态提示能在你浪费一轮 Play Mode 之前拦住这个问题。
自动启动还是手动启动
bootstrap 在 Play 时做的全部决定,一张小图就能画完:
- 自动启动(bootstrap)
- 手动启动(代码)
指定 Default Encounter,保持 Auto Start On Play 开启,按 Play。demo 场景、测试场景,以及任何只为跑一场战斗而存在的场景都适合这种方式。全部十二个 demo 场景的遭遇战都是这样来的。
游戏有战前菜单、地图节点或自定义转场时,关掉 Auto Start On Play,自己启动战斗:
using TinyGiants.GCS.Runtime;
using UnityEngine;
public class MapNodeButton : MonoBehaviour
{
public GameEncounter Encounter;
public void OnNodeClicked()
{
GCSApi.StartBattle(Encounter);
}
}
有一处差异要知道:On Bootstrap 这个 UnityEvent 只在 bootstrap 自己的自动启动路径上触发。自己调用 GCSApi.StartBattle 时,场景级反应也要由你自己的代码来做。
按 Play 之前先过一遍
- 场景里有
GameCardManager,六类数据库都已注册并启用。 - bootstrap 的
Default Encounter已指定,状态提示显示就绪。 - 遭遇战引用了一个玩家单位和至少一个敌人。
- 玩家单位的初始卡组存在,其中每张卡都在某个启用的卡牌数据库里。
- Workbench 校验没有阻塞性错误。参见校验与 Where-Used。
Demo 的做法
把 demo 场景当作已知可用的参考。搭新场景时先复制结构,再只替换需要更换的遭遇战和表现引用。如果复制出来的场景仍然启动旧战斗,说明 bootstrap 的 Default Encounter 还指着 demo 的遭遇战。
打开任意一个 demo 场景的 Hierarchy,可以看到同一结构:一个挂着两个组件的 GameCardManager 对象,周围是只负责表现、不接管战斗逻辑的对象。

每个 demo 场景都带一个 BattleSplashScreen,它会在加载时接管 bootstrap:读走 Default Encounter,把本次运行的自动启动关掉,播完遭遇战开场,再由它自己启动同一场战斗。bootstrap 的设置仍然决定打哪一场;开场画面只决定什么时候开打。