第二场战斗
在空场景中建立独立数据库与完整内容依赖链,亲手完成一场可以预告意图、选择目标、结算卡牌并推进回合的自定义战斗
完成第一场战斗后,你已经验证了卡牌、状态、敌人意图与回合推进,现在从空场景重新建立这条链路,让每项配置都能在后续资产和最终运行结果中找到明确对应
从状态到遭遇战的六类资产
六类内容并不是彼此独立的配置项,Embermark 会先创建为可供行为图引用的状态,Ember Strike 再使用它定义卡牌结算,随后进入 Ember Trial Deck,成为 Trial Hero 的抽牌来源,Trial Dummy 则通过另一张行为图复用同一状态,最后由 Ember Trial 汇总双方内容与战斗规则
| 创建顺序 | 资产 | 依赖与作用 |
|---|---|---|
| 1 | 状态 Embermark | 提供卡牌与敌人行为都会引用的可见叠层标记 |
| 2 | 卡牌 Ember Strike | 消耗 1 点能量,造成 6 点伤害并施加 1 层 Embermark |
| 3 | 卡组 Ember Trial Deck | 收录 10 份 Ember Strike,让起手与每回合抽牌结果保持确定 |
| 4 | 玩家 Trial Hero | 以 Ember Trial Deck 作为起始卡组,提供 60 点生命与 3 点基础能量 |
| 5 | 敌人 Trial Dummy | 预告 3 点 Attack,行动时造成伤害并施加 1 层 Embermark |
| 6 | 遭遇战 Ember Trial | 连接玩家、敌人、奖励卡组与回合规则,成为场景启动入口 |
这条依赖链从一套能够启动战斗的场景对象开始,场景初始化完成后,再停用六个预设数据库,只让本轮创建的新数据库保持 Active,后续选择器便不会混入 Demo 内容
1. 初始化战斗场景并切换数据库
初始化场景对象
在 Unity 中新建场景,然后打开 Game Card System
Tools > TinyGiants > GCS > Game Card System
点击 Initialize System,GCS 会保留场景中已有的 Main Camera,并创建同级的 GameCardManager、EventSystem、Background、Battle Runtime 与 Battle Fx Directors
展开 Battle Runtime,其中应包含战斗面板、手牌区、各类卡牌区与表现对象,初始化还会在 GameCardManager 上添加 GameCardEncounterBootstrap,并注册六类预设数据库

为了先排除场景接线问题,可以在 Encounter Bootstrap 中临时选择一个预设遭遇战,进入 Play Mode 确认战斗能够开始,再退出 Play Mode 返回当前场景,随后把内容来源切换到本轮创建的数据库,初始化对象及其职责见战斗场景与系统面板
切换到六个空数据库
回到 Edit Mode,在 Card、Deck、Player、Enemy、Status 和 Encounter 六个区域中分别点击一次 + New,若项目中没有同名资产,新数据库会使用下列默认名称,已经存在同名资产时,Unity 会自动追加序号,后续始终选择本轮刚创建的对应数据库
| 区域 | 默认名称 |
|---|---|
| Card | NewCardDatabase |
| Deck | NewDeckDatabase |
| Player | NewPlayerUnitDatabase |
| Enemy | NewEnemyUnitDatabase |
| Status | NewStatusDatabase |
| Encounter | NewEncounterDatabase |
六个数据库挂载完成后,将每个预设数据库切换为 Inactive,让新数据库保持 Active,每一栏都会显示 1/2 Active

1/2 Active 表明该栏仍挂载两个数据库,但 Game Card Editor 与 GameCardManager 只枚举启用的数据库,切换 Active 不会删除预设资产,也不会让已保存的直接引用失效,需要对照 Demo 时可以随时重新启用
通过 Tools > TinyGiants > GCS > Game Card Editor 打开 Game Card Editor,依次切换 Card、Deck、Player、Enemy、Status 与 Encounter,六个模式都应读取刚刚启用的新数据库,并显示空列表

Card 模式此时读取空的 NewCardDatabase,其余五个模式也应显示各自的新数据库与空列表,确认六个模式一致后,使用列表上方的 + 创建新内容,新的资产便会写入当前选中的数据库
2. 从共享状态建立卡牌行为
先让 Embermark 成为可引用内容
切换到 Status,确认当前选中的是本轮创建的新数据库,点击列表上方的 + 创建 Embermark
| 字段 | 值 |
|---|---|
| Name | Embermark |
| Description | Marked by embers. |
| Type | Debuff |
| Tags | Tutorial |
| Icon | Status_Burn |
| Stack Rule | Additive |
| Max Stacks | 9 |
| Decay Rule | Never |
| Show Stack Count | 开启 |
| Behavior | 留空,不添加触发器 |

Behavior Summary 此时保持 (no triggers),Embermark 在这场战斗中只承担可见、可叠加的标记,不会自行造成伤害,也不会因 Decay Rule = Never 自动减少,保存后,卡牌与敌人的 Change Status 节点便可以选择它,状态字段与行为触发器的完整关系见状态创作
让 Ember Strike 结算伤害与状态
切换到 Card,确认当前选中的是本轮创建的新数据库,点击列表上方的 + 创建 Ember Strike,先用基础字段确定费用、目标、分类与外观
| 字段 | 值 |
|---|---|
| Name | Ember Strike |
| Description | Deal 6 damage. Apply 1 Embermark. |
| Cost | 1 |
| Type | Support |
| Rarity | Common |
| Target | Single Enemy |
| Tags | Attack |
| Keywords | 留空 |
| Upgrade | None |
| Icon | Study |
| Template | Support |
Support 是卡牌 Type,用于分类并显示在卡面上;Attack 是独立的 Tag,供筛选和自定义规则识别攻击牌;Template = Support 则选择预览与运行时使用的卡牌预制体

右上角的 1 Warning 与 Behavior Summary 中的 (no triggers) 都来自空行为图,卡牌基础数据已经完整,但打出后还不会结算,点击 Edit FlowGraph,建立玩法链
On Card Played → Deal Damage → Change Status
| 节点 | 字段 | 值 |
|---|---|---|
| Deal Damage | Target | Opponent |
| Amount | 6 | |
| Ignore Armor | 关闭 | |
| Change Status | Target | Opponent |
| Amount | 1 | |
| Mode | Delta | |
| Status | Embermark |
Opponent 会解析为玩家选中的敌人,Deal Damage 将 6 点基础伤害送入伤害结算,Change Status 再增加 1 层 Embermark,玩法结果确定后,添加表现链
Play VFX → Play SFX → Show Floating Text
| 节点 | 字段 | 值 |
|---|---|---|
| Play VFX | Target | Opponent |
| Anchor | On Unit | |
| Prefab | VFX_BurnIgnite | |
| Lifetime | 0,自动 | |
| Play SFX | Clip | Mage2 |
| Volume | 1 | |
| Show Floating Text | Target | Opponent |
| Content | Amount | |
| Amount | 切换为输入端口,连接 Deal Damage → Dealt | |
| Include Sign | 开启 | |
| Custom Color | 关闭 | |
| Scale | 1 | |
| Duration | 1 | |
| Offset | (0, 0, 0) |
按照以下顺序把三个表现节点整理为 Play Effect
- 将
Show Floating Text的Content设为Amount,点击Amount右侧的小圆点切换为输入端口,再连接Deal Damage的Dealt - 暂时保持三个表现节点未分组,关闭 FlowGraph 窗口,再从
Ember Strike点击 Edit FlowGraph 重新打开,使Show Floating Text根据Dealt的直接来源刷新为 Damage 样式 - 选中三个表现节点并按
Ctrl+G,此时Dealt数据连线会自动保留为 Group 边界端口 - 将默认的
Group重命名为Play Effect,双击进入组,再点击需要显示在外层的参数标签,暴露Prefab、Clip、Include Sign、Custom Color、Scale与Duration - 返回父图,把
Change Status的流程输出连接到Play Effect的流程输入
两张 FlowGraph 截图记录的是静态 Amount = 6 与 Amount = 3 布局,这两个数值分别对应卡牌与敌人 Deal Damage 的基础值
当前编辑器不再手动选择 Kind,按上述步骤新建时,画布会比截图多出一条 Deal Damage → Dealt 数据连线,Amount 也会读取扣除护甲和 Hook 修正后的实际伤害

从 On Card Played 到 Play Effect 的路径已经完整连接,这张牌现在能够完成伤害、状态与表现结算,节点连接、Group 参数暴露与实际结算值的处理见流图编辑器,下一步则要把它加入卡组,让玩家能够在战斗中抽到
3. 把卡牌交给玩家,再补齐对手
卡组把可执行卡牌变成抽牌来源
切换到 Deck,点击列表上方的 + 创建 Ember Trial Deck,再把 Ember Strike 的 Copies 设为 10
| 字段 | 值 |
|---|---|
| Name | Ember Trial Deck |
| Description | Ten Ember Strikes for the second-battle tutorial. |
| Tags | 留空 |
| Icon | Deck_Warrior_Start |
| Cards | Ember Strike × 10 |

1 cards · 10 copies 表示卡组只有一个唯一卡牌条目,但共有十张运行时卡牌,本场起手抽 5 张、下一回合再抽 5 张时都只会得到 Ember Strike,卡组条目、Copies 与抽牌来源见卡组创作,这副卡组还需要成为玩家的 Starting Deck 才会真正进入战斗
玩家把卡组带入战斗
切换到 Player,点击列表上方的 + 创建 Trial Hero,并在 Deck 区域选择刚刚完成的 Ember Trial Deck
| 区域 | 字段 | 值 |
|---|---|---|
| Basic | Name | Trial Hero |
| Description | A tutorial player with a guaranteed Ember Strike draw. | |
| Tags | 留空 | |
| Visual | Icon | Avatar |
| Template | Prefab | |
| Attributes | Base HP | 60 |
| Base Energy | 3 | |
| Deck | Starting Deck | Ember Trial Deck |
| Energy | Name | Energy |
| Description | tutorial energy | |
| Icon | Energy |

玩家预览、60 HP · 3 Energy 与十张卡牌的起始卡组共同完成了玩家侧配置,Starting Deck 决定实际进入战斗的牌库,Energy 区域只定义资源在界面中的名称、说明与图标,相关字段的完整说明见角色创作
敌人用意图绑定预告与行动
战斗还需要一个能够预告并执行行动的对手,切换到 Enemy,点击列表上方的 + 创建 Trial Dummy,先配置生命、强度层级与表现资产
| 字段 | 值 |
|---|---|
| Name | Trial Dummy |
| Description | A predictable tutorial enemy. |
| Tier | Normal |
| Tags | 留空 |
| Icon | Avatar |
| Template | Prefab |
| HP Min | 24 |
| HP Max | 24 |

当前的 24 HP 与角色预览只确定敌人的基础数据和外观,Behavior Summary 与 Intents 仍然为空,点击 Edit FlowGraph,用 Leaf Intent 把 Attack 预告与敌人回合实际执行的路径绑定在一起
On Enemy Behavior Start → Leaf Intent(Attack)→ Deal Damage → Change Status
| 节点 | 字段 | 值 |
|---|---|---|
| Leaf Intent | Intent | Attack |
| Deal Damage | Target | Opponent |
| Amount | 3 | |
| Ignore Armor | 关闭 | |
| Change Status | Target | Opponent |
| Amount | 1 | |
| Mode | Delta | |
| Status | Embermark |
战斗开局会沿这条路径解析 Leaf Intent,并从后续 Deal Damage 提取数值 3,作为 Full 模式的 Attack 预告,敌人回合到来时,GCS 再执行已经规划的叶节点路径,对 Trial Hero 造成 3 点伤害并施加 1 层 Embermark
表现链会沿用卡牌已经建立的组织方式,只替换敌人的命中特效、音效与飘字数值
Play VFX → Play SFX → Show Floating Text
| 节点 | 字段 | 值 |
|---|---|---|
| Play VFX | Target | Opponent |
| Anchor | On Unit | |
| Prefab | VFX_ImpactHit | |
| Lifetime | 0,自动 | |
| Play SFX | Clip | Hit002 |
| Volume | 1 | |
| Show Floating Text | Target | Opponent |
| Content | Amount | |
| Amount | 切换为输入端口,连接 Deal Damage → Dealt | |
| Include Sign | 开启 | |
| Custom Color | 关闭 | |
| Scale | 1 | |
| Duration | 1 | |
| Offset | (0, 0, 0) |
将 Deal Damage → Dealt 接入飘字的 Amount 后,暂时保持三个表现节点未分组,关闭 FlowGraph 窗口,再从 Trial Dummy 点击 Edit FlowGraph 重新打开,将三个表现节点封装为 Play Effect
双击进入组并暴露 Prefab、Clip、Scale 与 Duration,Dealt 连线会自动形成 Amount 边界端口;Include Sign 与 Custom Color 保持组内配置,返回父图后,把 Change Status 的流程输出接入该组,飘字便会使用实际伤害值

至此,Leaf Intent 与后续伤害、状态和表现节点已经处于同一条路径,Trial Hero 与 Trial Dummy 也分别具备开局所需的卡组、属性和行为,敌人意图与行为图的更多组合见敌人创作与常用敌人模式,双方内容就绪后便可以由 Encounter 汇总整场战斗
4. 由 Encounter 汇总整场战斗
切换到 Encounter,点击列表上方的 + 创建 Ember Trial,将前面完成的玩家、敌人和卡组分别放入 Player、Enemy Units 与 Reward Deck,再配置起手、抽牌、能量和回合规则
| 区域 | 字段 | 值 |
|---|---|---|
| Basic | Name | Ember Trial |
| Description | A complete second-battle tutorial encounter. | |
| Difficulty | Normal | |
| Tags | 留空 | |
| Visual | Icon | Background,在初始化出的战斗场景中作为战斗背景显示 |
| Player | Player | Trial Hero |
| Enemy Units | Enemy Units | Trial Dummy × 1 |
| Reward Deck | Reward Deck | Ember Trial Deck |
| Battle Rules | Starting Hand Size | 5 |
| Draw Per Turn | 5 | |
| Max Hand Size | 10 | |
| Starting Energy | 0 | |
| Card Reward Count | 3 | |
| Armor Decay | ResetOnTurnStart | |
| Hand Discard | DiscardOnTurnEnd | |
| Enemy Intent Display | Full | |
| Animation Gap | 0.28 秒 |
这组规则中有四项容易因字段名称而产生误解:
-
Starting Energy = 0表示 Encounter 不覆盖玩家的基础能量,运行时会回退到Trial Hero的Base Energy = 3,因此 Play Mode 开局仍然显示3/3 -
Full会保留意图图标与可计算数值,所以这条敌人行为会显示数值为3的 Attack,IconOnly会隐藏数值,Hidden会隐藏全部意图 -
Card Reward Count = 3是候选数量上限,Ember Trial Deck只有一个唯一条目Ember Strike × 10,奖励抽取不会重复选择同一条目,因此本场获胜时最多只能生成一个卡牌候选 -
Animation Gap会随 Encounter 保存,但当前运行时尚未读取这个字段,因此0.28不会改变节点执行或阶段推进的间隔

Lineup 此时显示 Trial Hero 对阵 Trial Dummy,Battle Rules 摘要也对应 Hand 5、Draw 5、Hand Max 10、Energy 0、Reward 3 与 Intent Full,双方阵容、奖励来源与战斗规则已经完整,最后,选择 GameCardManager,在 Encounter Bootstrap 中指定 Ember Trial,并开启 Auto Start On Play

绿色状态 Ready — starts on Play 表明 Ember Trial 位于当前激活的 Encounter Database 中,Auto Start On Play 也已经开启,进入 Play Mode 时,Bootstrap 会把这个 Encounter 交给 GameCardManager 启动,Encounter 的阵容、规则与奖励边界见遭遇战创作,场景自动启动与代码入口见战斗启动
5. 在 Play Mode 验证完整战斗
进入 Play Mode,开局画面应对应前面配置的玩家、敌人、卡组、能量规则与意图显示,Trial Hero 为 60/60,Trial Dummy 为 24/24,能量为 3/3;画面中还应有 5 张 Ember Strike 手牌、5 张抽牌、0 张弃牌,以及敌人上方数值为 3 的 Attack

五张同名手牌来自十份 Ember Strike,Attack 3 来自敌人已经解析的 Leaf Intent → Deal Damage 路径,这些开局结果成立后,点击一张 Ember Strike,卡牌的 Single Enemy 目标模式会进入选敌状态,战场变暗,红色箭头指向 Trial Dummy,目标周围出现白色角标

遮罩、箭头与角标出现时,点击 Trial Dummy 确认目标,On Card Played 会沿伤害、状态与表现组完成整条卡牌路径

结算完成后,能量从 3 降到 2,手牌从 5 张变为 4 张,弃牌堆从 0 变为 1,敌人生命从 24 降到 18,状态栏出现 1 层 Embermark,费用、目标、伤害、状态与牌堆移动应在同一次出牌中生效
点击 End Turn,DiscardOnTurnEnd 会把剩余 4 张手牌移入弃牌堆,Trial Dummy 随后执行 Attack 3,对玩家造成 3 点伤害并施加 1 层 Embermark,行动完成后,系统先解析下一次 Attack 3,再进入第二个玩家回合,补满 3 点能量并抽取剩余 5 张卡牌

第二个玩家回合开始时,Trial Hero 变为 57/60,并带有 1 层 Embermark,对应敌人刚刚执行的伤害与状态路径,此时能量恢复为 3/3,手牌、抽牌堆与弃牌堆依次为 5、0、5,而敌人身上先前施加的 Embermark 仍保持 1 层,也与 Decay Rule = Never 和空 Behavior 完全一致
最后检查 Console,若没有 GCS 报错,说明数据库激活、内容引用、两张 FlowGraph、Encounter 汇总和 Bootstrap 启动均已通过验证
至此,数据库激活、内容引用、两张 FlowGraph、Encounter 汇总与 Bootstrap 启动都已经得到可见结果,恭喜你已经完成了第一个完整的战斗场景的制作
抽牌、弃牌、敌方阶段与下一回合的完整推进顺序见战斗循环