战斗循环
每场 GCS 战斗都遵循同一个循环:加载遭遇战、抽牌、出牌、结算敌人意图,直到进入胜利或失败阶段。本页将该循环对应到 BattlePhase 枚举值。
适用于确认卡牌何时可以打出、状态何时结算、战斗何时结束,以及运行时当前处于哪个阶段。GCS 的战斗流程由固定阶段推进:加载遭遇战,抽牌,在玩家阶段出牌,结算敌人意图,然后进入下一个回合,直到胜利或失败。设计卡牌、状态、敌人和遭遇战时,应先确认它们对应的阶段和触发时机。
运行时用 BattlePhase 表示当前阶段:
阶段概览
| 阶段 | 面向用户的含义 |
|---|---|
Initialize | 正在准备遭遇战、单位、牌组、规则和初始手牌 |
PlayerTurnStart | 结算回合开始规则、抽牌、能量、状态和 hook |
PlayerPhase | 玩家可以查看手牌、选择目标、打出卡牌并结束回合 |
PlayerTurnEnd | 结算回合结束弃牌、状态衰减、延迟触发和清理 |
EnemyPhase | 敌人展示或结算意图,并运行各自的行为图 |
BattleWon | 所有胜利条件已经满足,可以播放奖励和胜利表现 |
BattleLost | 玩家失败,可以播放失败表现并执行清理 |
None 表示没有活动战斗,通常出现在战斗创建之前或拆除之后。
加载遭遇战
战斗从一个遭遇战(encounter)开始。遭遇战提供玩家单位、敌人阵容、奖励牌组、战斗规则,以及场景可使用的标签和显示信息。场景 bootstrap 和 GameCardManager 会把场景连接到选中的遭遇战和当前启用的数据库。
战斗规则会驱动 PlayerTurnStart 和 PlayerTurnEnd 中的大部分流程。以 demo 遭遇战 The Threshing Field 为例:初始手牌 5 张、每回合抽 5 张、手牌上限 10、护甲回合开始重置、回合结束弃牌。修改这些规则会直接改变回合循环。
玩家回合
在 PlayerTurnStart,GCS 按顺序应用遭遇战规则:重置或保留护甲,增加本回合能量,抽牌,结算回合开始的状态和 hook,最后执行手牌上限。
在 PlayerPhase 中,一张牌要同时满足这些条件才可以打出:
- 它在手牌中;
- 结算费用修正后,玩家仍有足够能量;
- 目标模式已经满足(
SingleEnemyUnit的牌需要选中一个存活敌人); - 可打出性 hook 没有取消它;
- 战斗当前没有在等待其他流程,例如一个选择或动画门
在代码中,GCSApi.CanPlayCard 使用同一份检查清单。任何条件不满足时,GCSApi.TryPlayCard 返回 false,不会抛异常。
卡牌结算后,会根据卡牌标签和规则移动到对应牌堆:通常进入弃牌堆,消耗牌进入消耗(exhaust)堆。
包含。手牌指检查时手牌堆中的全部卡牌,包括同一回合内由其他卡牌效果抽到的牌。
敌人回合
敌人的行为通过 FlowGraph 创作。敌人阶段通常按顺序执行三件事:结算敌人意图,运行每个敌人的行动,然后推进到下一个玩家回合。
意图(intent)是面向玩家的行动预告。每个敌人在行动前都会显示自己将要执行的行动类别,即使底层行为图更复杂。意图应准确反映下一步行动,让玩家可以规划自己的回合。
胜利、失败与奖励
胜利表示所有必需击败的敌人都已被击败。失败表示玩家单位死亡,或战斗规则进入失败状态。胜负判定由阶段机制执行,通常发生在回合切换和出牌结算之后。只从代码直接修改 HP 不会立即结束战斗;循环会在下一次判定时发现结果。
阶段进入 BattleWon 后,demo 会显示奖励界面:从遭遇战奖励池抽出的卡牌、永久能量升级,或永久费用折扣。

从代码观察循环
GCSApi 直接暴露了这个循环。订阅返回 IDisposable,组件销毁时记得释放:
using TinyGiants.GCS.Runtime;
// React to loop milestones.
var turnSub = GCSApi.OnTurnStarted(args =>
Debug.Log($"Turn {GCSApi.TurnNumber} started"));
var playSub = GCSApi.OnCardPlayed(args =>
Debug.Log("A card resolved"));
// Or poll the phase anywhere.
if (GCSApi.Phase == BattlePhase.PlayerPhase && GCSApi.IsPlayerTurn)
{
GCSApi.EndPlayerTurn();
}
在 Play Mode 中打开 Game Card Monitor,可以直接查看阶段状态。Phase 标签显示当前阶段和历史记录;当它显示 BattleWon 或 BattleLost 时,表示核心运行时已经得出结果,即使奖励 UI 或失败表现仍在播放。

设计建议
- 让
PlayerPhase中的卡牌效果保持可读。 - 把延迟或反应式行为放在明确的触发器或状态上。
- 在敌人行动前显示可读意图。
- 用 hook 修改数值,不要用 hook 隐藏卡牌的主要结果。
- 阶段行为不符合预期时,先看 Monitor,再检查 FlowGraph。