运行时问题
从 Monitor 中的当前状态和执行记录出发,定位故障发生在启动、阶段、Behavior、等待、事件还是表现层
战斗没有启动
进入 Play Mode 后没有出现战斗,先检查四项启动条件:
-
场景中存在一个启用的
GameCardManager -
固定场景的 Bootstrap 已指定
Default Encounter并开启 Auto Start On Play,或项目代码确实调用了GCSApi.StartBattle -
Encounter 包含有效 Player 与至少一个 Enemy
-
Manager 注册了本场需要主动解析的数据库
Monitor 的 Battle 显示 No active battle 时,只能确认当前没有可读取的战斗,继续检查 Console 中第一条 GCS 错误和完整调用栈;后续错误可能只是同一问题的连锁结果
修复后请重新进入 Play Mode,确认 Battle 显示 Encounter、玩家、敌人和当前 Phase,并出现 OnBattleStarted 记录
操作没有被接受
卡牌无法打出或 End Turn 没有响应时,请核对操作成立所需的状态:
-
Phase是否为PlayerPhase -
卡牌是否仍位于 Hand,当前有效费用是否不高于玩家能量
-
Single Enemy的已选目标是否存活且合法 -
Card Playable Hook是否取消出牌 -
当前是否正在等待 Choice 或 Reward
- 项目 UI 应使用
GCSApi.CanPlayCard(card)更新按钮状态,并检查TryPlayCard的返回结果,不要只根据卡面费用决定是否可出牌 - 修复后重新执行同一操作,确认 API 返回成功,并在 Monitor 中看到手牌、能量、阶段或等待状态发生对应变化
卡牌结算异常
卡牌已经离开手牌,但伤害、状态或牌堆结果不符合预期时:
- 在
Flow中确认正确的 Card Owner 与 Entry 已执行 - 在
Unit中核对 HP、护甲与状态层数 - 在
Pile中确认卡牌进入 Discard 还是 Exhaust - 检查
Exhaust、Retain、Ethereal、Unplayable等关键词与 Encounter 的 Hand Discard 规则 - 检查费用、伤害、护甲与状态相关 Hook 是否修改或取消结果
-
自定义节点必须通过
ctx.Controller修改战斗状态,直接改写对象字段会绕开事件、Hook 和 Monitor 记录,将导致 UI 与运行状态不同步 -
修复后重放同一张卡牌,
Flow中的执行路径应与Unit、Pile中的最终状态一致
流程停止推进
先在 Phase 中确认最后一次阶段转换,再检查当前等待类型:
| 等待类型 | 证据 | 修复方向 |
|---|---|---|
| Gate | Gate 中存在只有 Acquire、没有 Release 的 Reason | 确保表现流程在成功、失败和中止分支都释放同一 Holder |
| Choice | Battle 或 Phase 显示 Choice Pending | 场景保留一个可用的 IChoicePresenter,并提交选择或 Skip |
| Reward | GCSApi.IsWaitingForReward 为 true | 奖励 UI 提交一次 ApplyReward 或 SkipReward |
| Wait | Flow 已进入显式 Wait 路径 | 核对等待时长与对象生命周期 |
普通 VFX、SFX 和动画不会自动阻塞阶段,只有 Behavior 显式使用 Wait、Gate 或 Choice,或奖励流程等待提交时,GCS 才会保持等待状态
释放等待后,请确认 Gate 不再保留对应 Holder,Choice 或 Reward 的 Pending 状态,并出现下一次 Phase 记录
事件监听没有响应
复现前打开 Monitor 的 Event 标签页,并按记录状态定位订阅问题:
-
事件没有记录:确认对应玩法时机确实发生,并清除 Filter 后重试
-
事件已有记录但
subs 0:广播时没有订阅者,检查订阅时机 -
存在订阅者但目标 UI 无响应:检查事件名、Payload 类型、回调对象和回调逻辑
-
回调重复执行:检查是否重复订阅,或旧
IDisposable没有释放
需要接收 OnBattleStarted 或起手抽牌事件的对象必须在调用 StartBattle 前完成订阅,完整模式见事件使用指南
修复后清除 Event 历史并重新触发一次时机,预期事件、订阅者数量和回调次数应当一致