跳到主要内容

战斗场景

GCS · Setup

战斗场景 = 那对设置组件 + 玩家看到的一切:单位区域、手牌 UI、HUD 组件和表现辅助。想最快得到一个可运行场景,可以复制 demo 场景。

适合搭第一个战斗场景的人,也适合排查单位和 UI 为什么不上屏的人。

战斗场景就是一个普通的 Unity 场景,装着 Manager 与 Bootstrap,外加玩家看到的一切。demo 附带十二个:每个职业三个,对应 Normal、Elite、Boss 三档,位于:

Assets/TinyGiants/GameCardSystem/Demo/Scenes/<Class>/

它们完整、调好了参数,是做出你自己场景的最快路径。

Hunter demo 场景 Fenmoss Hollow 的 Play Mode 画面:手牌、能量计数、抽牌堆,敌人头顶显示意图


战斗场景包含什么

部件用途
相机与灯光渲染战斗版面和 UI
GameCardManager + GameCardEncounterBootstrap提供启用数据库,选定并启动遭遇战
玩家与敌人单位区域给运行时单位一个上屏的位置
手牌与卡牌 UI显示卡牌、牌堆、目标选择和出牌交互
回合与结算 UIEnd Turn 按钮、阶段反馈、胜负弹窗
状态与意图 UI单位状态图标和敌人意图指示
表现辅助VFX、浮动文字、镜头冲击、背景适配

前两行决定战斗能否运行;下面的所有行决定战斗是否可见。

这对设置组件挂在同一个 GameObject 上:GameCardEncounterBootstrap 要求旁边有 GameCardManager。bootstrap 的 inspector 有三个字段:Default Encounter 选定要打哪场,Auto Start On Play 让战斗随场景加载立即开始(默认开启;想由自己的代码决定开战时机就关掉它),On Bootstrap 是战斗启动后立刻触发的 UnityEvent。字段细节见 Manager 与 Bootstrap

一个 demo 场景的 Hierarchy 一眼就能看清结构:一个 GameCardManager 对象承载这对设置组件,展示层的根对象排在它旁边,互不干涉战斗逻辑。

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


复制着搭

  1. 复制一个最接近目标布局的 demo 场景。
  2. 把副本移动并重命名到你项目的场景文件夹。
  3. 把 bootstrap 的 Default Encounter 换成你自己的。
  4. 只在需要的地方替换玩家和敌人的表现资源。
  5. 第一次测试前不要动任何 UI 引用。
  6. 进入 Play Mode,确认战斗能启动。
  7. 之后再改布局、背景、音频或 VFX。

顺序很重要。一次只改一样,场景设置错误和表现重做就不会搅在一起,出了问题你能确切知道是哪一步改坏的。


单位区域

单位先是数据,然后才是画面。demo 的 BattleBoard 组件把玩家单位放在 PlayerArea 上,把每个敌人分配到 EnemyAreas 列表里下一个空位。如果 Monitor 里能看到单位而屏幕上没有,先检查这些区域和单位 prefab,不要先改数据。

区域或 prefab 引用失效的典型症状:

  • 玩家单位数据存在,画面上却没有形象;
  • 敌人在运行时存在,但叠在一起或跑到屏幕外;
  • 目标箭头指向错误位置;
  • 浮动文字出现在莫名其妙的地方。

这些全是场景和表现问题。改多少卡牌数据库都治不了。


UI 引用

demo 的 HUD 由一堆小组件拼成,各自绑定一块运行时状态:EndTurnButtonUnitHpBarUnitStatusIconListEnemyUnitIntentIndicatorDeckCounterDiscardCounterExhaustCounter 三个牌堆计数,以及 BattleResultPopupCardRewardView。运行时状态在变而画面不动时,就是其中某个组件丢了引用。

让 Monitor 来裁决

Play Mode 期间打开 Game Card Monitor,把它的数值和屏幕显示对一对。状态对、画面错,是 UI 引用问题;状态本身就错,问题在上游的数据或行为里,UI 是无辜的。


一个场景,一场遭遇战

每个 demo 场景只启动一场遭遇战,场景文件就用它命名:

Demo/Scenes/Warrior/1-The Threshing Field.unity
Encounter: The Threshing Field

自己的项目也保持这个模式。当 bug 报告写着「场景 X 里那场战斗不对」时,一对一的命名让你直接知道该打开哪个遭遇战,不需要回溯资产引用。