战斗场景
战斗场景 = 那对设置组件 + 玩家看到的一切:单位区域、手牌 UI、HUD 组件和表现辅助。想最快得到一个可运行场景,可以复制 demo 场景。
适合搭第一个战斗场景的人,也适合排查单位和 UI 为什么不上屏的人。战斗场景就是一个普通的 Unity 场景,装着 Manager 与 Bootstrap,外加玩家看到的一切。demo 附带十二个:每个职业三个,对应 Normal、Elite、Boss 三档,位于:
Assets/TinyGiants/GameCardSystem/Demo/Scenes/<Class>/
它们完整、调好了参数,是做出你自己场景的最快路径。

战斗场景包含什么
| 部件 | 用途 |
|---|---|
| 相机与灯光 | 渲染战斗版面和 UI |
GameCardManager + GameCardEncounterBootstrap | 提供启用数据库,选定并启动遭遇战 |
| 玩家与敌人单位区域 | 给运行时单位一个上屏的位置 |
| 手牌与卡牌 UI | 显示卡牌、牌堆、目标选择和出牌交互 |
| 回合与结算 UI | End Turn 按钮、阶段反馈、胜负弹窗 |
| 状态与意图 UI | 单位状态图标和敌人意图指示 |
| 表现辅助 | VFX、浮动文字、镜头冲击、背景适配 |
前两行决定战斗能否运行;下面的所有行决定战斗是否可见。
这对设置组件挂在同一个 GameObject 上:GameCardEncounterBootstrap 要求旁边有 GameCardManager。bootstrap 的 inspector 有三个字段:Default Encounter 选定要打哪场,Auto Start On Play 让战斗随场景加载立即开始(默认开启;想由自己的代码决定开战时机就关掉它),On Bootstrap 是战斗启动后立刻触发的 UnityEvent。字段细节见 Manager 与 Bootstrap。
一个 demo 场景的 Hierarchy 一眼就能看清结构:一个 GameCardManager 对象承载这对设置组件,展示层的根对象排在它旁边,互不干涉战斗逻辑。

复制着搭
- 复制一个最接近目标布局的 demo 场景。
- 把副本移动并重命名到你项目的场景文件夹。
- 把 bootstrap 的
Default Encounter换成你自己的。 - 只在需要的地方替换玩家和敌人的表现资源。
- 第一次测试前不要动任何 UI 引用。
- 进入 Play Mode,确认战斗能启动。
- 之后再改布局、背景、音频或 VFX。
顺序很重要。一次只改一样,场景设置错误和表现重做就不会搅在一起,出了问题你能确切知道是哪一步改坏的。
单位区域
单位先是数据,然后才是画面。demo 的 BattleBoard 组件把玩家单位放在 PlayerArea 上,把每个敌人分配到 EnemyAreas 列表里下一个空位。如果 Monitor 里能看到单位而屏幕上没有,先检查这些区域和单位 prefab,不要先改数据。
区域或 prefab 引用失效的典型症状:
- 玩家单位数据存在,画面上却没有形象;
- 敌人在运行时存在,但叠在一起或跑到屏幕外;
- 目标箭头指向错误位置;
- 浮动文字出现在莫名其妙的地方。
这些全是场景和表现问题。改多少卡牌数据库都治不了。
UI 引用
demo 的 HUD 由一堆小组件拼成,各自绑定一块运行时状态:EndTurnButton、UnitHpBar、UnitStatusIconList、EnemyUnitIntentIndicator,DeckCounter、DiscardCounter、ExhaustCounter 三个牌堆计数,以及 BattleResultPopup 和 CardRewardView。运行时状态在变而画面不动时,就是其中某个组件丢了引用。
Play Mode 期间打开 Game Card Monitor,把它的数值和屏幕显示对一对。状态对、画面错,是 UI 引用问题;状态本身就错,问题在上游的数据或行为里,UI 是无辜的。
一个场景,一场遭遇战
每个 demo 场景只启动一场遭遇战,场景文件就用它命名:
Demo/Scenes/Warrior/1-The Threshing Field.unity
Encounter: The Threshing Field
自己的项目也保持这个模式。当 bug 报告写着「场景 X 里那场战斗不对」时,一对一的命名让你直接知道该打开哪个遭遇战,不需要回溯资产引用。