第一场战斗
运行一场 demo 遭遇战,从开局手牌、出牌结算、敌人回合到胜利奖励,确认 GCS 战斗循环正常工作。
适用于首次验证 GCS 的项目。本文不创作内容,只确认已配置的战斗可以完整运行。GCS 自带 12 个可运行的战斗场景。理解运行时的第一步,是先运行一场已配置的 demo 遭遇战。本文使用 Hunter 的第一场遭遇战 Fenmoss Hollow,说明从进入 Play Mode 到选择胜利奖励的完整流程,并列出每一步应确认的状态。
请先完成安装与初始化。在修改内容前,先确认一场已知可用的战斗可以完整运行。
打开 demo 战斗场景
Demo 场景位于:
Assets/TinyGiants/GameCardSystem/Demo/Scenes/<Class>/<n>-<Name>.unity
四个职业文件夹(Hunter、Mage、Priest、Warrior),每个职业三个场景,按层级排列:第 1 关是普通战,第 2 关是精英战,第 3 关是 Boss 战。本文打开 Hunter/1-Fenmoss Hollow.unity;截图也来自该场景。
每个 demo 场景都已完成必要引用。搭建自定义场景时,需要准备同一组对象:
| 场景对象 | 提供什么 |
|---|---|
GameCardManager | 战斗读取内容用的活动预设数据库 |
GameCardEncounterBootstrap | 本场景的 Default Encounter,以及 Auto Start On Play 开关 |
| Battle UI | 手牌、单位、能量、意图、状态、奖励和结算 widget |
| 玩家和敌人锚点 | 单位在棋盘上生成的位置 |
场景打开后,进入 Play Mode 前,应能在 Hierarchy 中找到以上对象。
开始战斗
- 自动开始(demo 默认)
- 从代码启动
按下 Play。每个 demo 场景的 bootstrap 都启用了 Auto Start On Play,遭遇战会自动开始。
当战斗的开始时机由你自己的游戏流程决定时,关掉 bootstrap 上的 Auto Start On Play,然后自己启动:
using TinyGiants.GCS.Runtime;
using UnityEngine;
public sealed class BattleStarter : MonoBehaviour
{
[SerializeField] private GameEncounter encounter;
private void Start()
{
GCSApi.StartBattle(encounter);
}
}
战斗开始时,GCS 根据遭遇战构建玩家和敌人,把初始卡组洗入抽牌堆,抽取起手手牌,触发 OnBattleStarted,为敌人生成意图,然后进入玩家阶段。棋盘应显示以下状态:

读懂棋盘
Fenmoss Hollow 的第一回合包含以下信息:手牌五张(Poison Arrow、两张 Strike、Insight、Defend),能量 3/3,抽牌堆剩 12 张,Hunter 为 70/70 HP,一个 16 HP 的敌人显示意图图标。
| UI 区域 | 告诉你什么 |
|---|---|
| 手牌 | 本回合可以打出的卡牌 |
| 能量 | 打牌消耗的资源,回合开始时补满 |
| 玩家单位 | 你的 HP、护甲,以及身上的状态 |
| 敌方单位 | 敌人 HP、状态,以及预告下一步行动的意图图标 |
| 牌堆计数 | 抽牌堆、弃牌堆和消耗堆各有多少张 |
如果起手手牌为空,通常表示遭遇战缺少有效初始卡组,或者 manager 上缺少活动 card database。应在 Workbench 中检查内容配置。
打出一张卡
Poison Arrow 费用为 1,效果与卡面文字一致:造成 3 点伤害,附加 2 层 Poison。对敌人打出后,应看到敌人变为 13/16 HP 并获得 2 层 Poison 图标,玩家能量降为 2,弃牌堆计数变为 1。

这次出牌会执行一组固定流程:支付能量、触发 OnCardPlayed、执行卡牌行为图,并把卡牌移入弃牌堆。
卡牌是否需要选择目标,取决于卡牌定义中的 Target Mode。Poison Arrow 使用 SingleEnemyUnit,因此需要指定一个敌人:
| Target Mode | 目标 |
|---|---|
SingleEnemyUnit | 选中一个敌人 |
AllEnemyUnits | 直接打出,所有存活敌人都会受影响 |
Self | 直接打出,效果落在玩家身上 |
None | 直接打出,由卡牌的行为图决定影响谁 |
如果一张卡拒绝打出,运行时是出于以下原因之一拦下了它:
- 当前不是玩家阶段
- 这张卡不在手牌堆里
- 能量低于卡牌的实际费用(费用修正也算在内)
- 卡牌带有
Unplayable关键字 - 某个状态 hook 取消了这次出牌
结束回合
按下结束回合按钮。GCS 按战斗规则和关键字弃牌或保留手牌,执行状态的回合末行为,然后进入敌人阶段:每个存活敌人执行自己的行为图,结算意图预告的行动,并生成下一回合意图。随后第二回合开始,系统抽取新的手牌。

敌人阶段结束后,应确认三类变化:Poison 按层数造成伤害,敌人从 13 HP 降到 11 HP;Poison 层数从 2 衰减到 1;敌人行动在玩家血条下方添加了一个减益图标。牌堆计数也会更新为抽牌堆 7 张、弃牌堆 5 张。
敌人头顶的图标表示它下回合的行动,通常在上一回合结束时决定。意图展示程度由遭遇战的战斗规则控制;demo 遭遇战会显示完整意图,便于围绕下一步行动做决策。
获胜并选择奖励
继续出牌直到敌人被击败。胜利后会显示奖励界面:从遭遇战奖励池抽出的三张卡牌,外加 +1 Max Energy 选项、永久的 -1 Cost (All Cards) 折扣,以及 Skip 按钮。

运行时会在两个时机发出事件:奖励选项出现时触发 GCSEventNames.OnBattleRewardOffered,战斗结束时由 OnBattleEnded 报告结果。战败时,该事件参数中的 Won 为 false。
成功标准
以下条件全部成立时,说明战斗循环在当前项目中运行正常:
- 遭遇战在 Play Mode 中开始,起手手牌出现
- 费用足够的卡牌能打出,效果会改变 HP、护甲、能量和状态
- 结束回合按钮把控制权交给敌人,意图在回合之间变化
- 战斗能走到奖励界面或战败结算,Console 全程没有报错