跳到主要内容

Manager 与 Bootstrap

GCS · Setup

每个 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

Game Card System 仪表盘:Initialize System 卡片、更新日志与快捷入口

这个按钮会在当前打开的场景里做四件具体的事:

  1. 查找 GameCardManager;找不到就创建一个名为 GameCardManager 的 GameObject 并挂上该组件。
  2. 若缺少 GameCardEncounterBootstrap,在旁边补上一个。
  3. 注册 Demo/Databases/ 下的六个预设数据库,并全部标记为启用。
  4. 选中该 GameObject,方便你立即检查结果。

Initialize System 之后的 GameCardManager Inspector:从 Card 到 Encounter 六个数据库组全部显示 1/1 Active,各挂一个预设数据库,下方是 Overview 面板

重复点击是安全的

Initialize System 只补缺。你自己注册的数据库不会被动到,已注册的预设也不会重复添加。六类数据库都就位后,按钮会变为已初始化状态。


Bootstrap 逐字段说明

字段含义
Default Encounter本场景要启动的遭遇战。Inspector 会把它显示成一张卡片,标出该遭遇战的玩家单位和敌人数量,便于确认选择是否正确
Auto Start On Play默认开启。启用时,进入 Play Mode 的瞬间自动开始该遭遇战
On Bootstrap战斗启动后立即触发的 UnityEvent。适合做场景级反应,比如播放音乐或隐藏加载遮罩

GameCardEncounterBootstrap 的 inspector:Default Encounter 显示成一张卡片,标出玩家单位和敌人数量,一行绿色 Ready 状态提示,Auto Start On Play 开关处于开启

选遭遇战时,点卡片上的选择图标(或直接双击卡片),会弹出一个搜索列表,列出项目里的全部遭遇战。旁边两个图标分别用来在 Project 窗口定位该资产、以及清空当前选择。

Inspector 还会在遭遇战卡片下方显示一行状态提示。按 Play 之前先检查:

状态提示含义
Ready,Play 即启动遭遇战已指定,且能通过某个启用的遭遇战数据库找到
请选择遭遇战,或关闭 Auto Start On Play自动启动已开启但没有指定遭遇战。进入 Play Mode 只会记录一条警告,什么都不启动
所选遭遇战不在任何启用的 EncounterDatabase 中资产存在,但 manager 看不见它。注册包含它的数据库,或把该数据库的启用开关打开
没有注册启用的 Encounter Databasemanager 完全没有遭遇战数据库。运行 Initialize System,或注册你自己的
没有遭遇战,就没有战斗

Auto Start On Play 开着而 Default Encounter 为空时,GCS 会在 Play 时记录一条警告并直接跳过启动。场景看起来一切正常,就是没有战斗。状态提示能在你浪费一轮 Play Mode 之前拦住这个问题。


自动启动还是手动启动

bootstrap 在 Play 时做的全部决定,一张小图就能画完:

指定 Default Encounter,保持 Auto Start On Play 开启,按 Play。demo 场景、测试场景,以及任何只为跑一场战斗而存在的场景都适合这种方式。全部十二个 demo 场景的遭遇战都是这样来的。


按 Play 之前先过一遍

  1. 场景里有 GameCardManager,六类数据库都已注册并启用。
  2. bootstrap 的 Default Encounter 已指定,状态提示显示就绪。
  3. 遭遇战引用了一个玩家单位和至少一个敌人。
  4. 玩家单位的初始卡组存在,其中每张卡都在某个启用的卡牌数据库里。
  5. Workbench 校验没有阻塞性错误。参见校验与 Where-Used

Demo 的做法

把 demo 场景当作已知可用的参考。搭新场景时先复制结构,再只替换需要更换的遭遇战和表现引用。如果复制出来的场景仍然启动旧战斗,说明 bootstrap 的 Default Encounter 还指着 demo 的遭遇战。

打开任意一个 demo 场景的 Hierarchy,可以看到同一结构:一个挂着两个组件的 GameCardManager 对象,周围是只负责表现、不接管战斗逻辑的对象。

The Spore Bog demo 场景的 Hierarchy:承载设置组件对的 GameCardManager 对象,旁边是展示层根对象 Background、Battle Runtime、Battle Fx Directors

为什么 demo 战斗在开场动画之后才开始

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