跳到主要内容

第二场战斗

Guide

在空场景中建立独立数据库与完整内容依赖链,亲手完成一场可以预告意图、选择目标、结算卡牌并推进回合的自定义战斗

完成第一场战斗后,你已经验证了卡牌、状态、敌人意图与回合推进,现在从空场景重新建立这条链路,让每项配置都能在后续资产和最终运行结果中找到明确对应

从状态到遭遇战的六类资产

六类内容并不是彼此独立的配置项,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 HeroEmber 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,并创建同级的 GameCardManagerEventSystemBackgroundBattle RuntimeBattle Fx Directors

展开 Battle Runtime,其中应包含战斗面板、手牌区、各类卡牌区与表现对象,初始化还会在 GameCardManager 上添加 GameCardEncounterBootstrap,并注册六类预设数据库

初始化后的场景 Hierarchy,包含 GameCardManager、EventSystem、Background 与完整 Battle Runtime

为了先排除场景接线问题,可以在 Encounter Bootstrap 中临时选择一个预设遭遇战,进入 Play Mode 确认战斗能够开始,再退出 Play Mode 返回当前场景,随后把内容来源切换到本轮创建的数据库,初始化对象及其职责见战斗场景系统面板

切换到六个空数据库

回到 Edit Mode,在 Card、Deck、Player、Enemy、Status 和 Encounter 六个区域中分别点击一次 + New,若项目中没有同名资产,新数据库会使用下列默认名称,已经存在同名资产时,Unity 会自动追加序号,后续始终选择本轮刚创建的对应数据库

区域默认名称
CardNewCardDatabase
DeckNewDeckDatabase
PlayerNewPlayerUnitDatabase
EnemyNewEnemyUnitDatabase
StatusNewStatusDatabase
EncounterNewEncounterDatabase

六个数据库挂载完成后,将每个预设数据库切换为 Inactive,让新数据库保持 Active,每一栏都会显示 1/2 Active

六类数据库均保留预设引用,预设数据库为 Inactive,新数据库为 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,六个模式都应读取刚刚启用的新数据库,并显示空列表

Game Card Editor 已选中空的 NewCardDatabase,Card 列表尚无内容

Card 模式此时读取空的 NewCardDatabase,其余五个模式也应显示各自的新数据库与空列表,确认六个模式一致后,使用列表上方的 + 创建新内容,新的资产便会写入当前选中的数据库

2. 从共享状态建立卡牌行为

先让 Embermark 成为可引用内容

切换到 Status,确认当前选中的是本轮创建的新数据库,点击列表上方的 + 创建 Embermark

字段
NameEmbermark
DescriptionMarked by embers.
TypeDebuff
TagsTutorial
IconStatus_Burn
Stack RuleAdditive
Max Stacks9
Decay RuleNever
Show Stack Count开启
Behavior留空,不添加触发器

Embermark 的减益分类、叠层上限、衰减规则与显示设置

Behavior Summary 此时保持 (no triggers)Embermark 在这场战斗中只承担可见、可叠加的标记,不会自行造成伤害,也不会因 Decay Rule = Never 自动减少,保存后,卡牌与敌人的 Change Status 节点便可以选择它,状态字段与行为触发器的完整关系见状态创作

让 Ember Strike 结算伤害与状态

切换到 Card,确认当前选中的是本轮创建的新数据库,点击列表上方的 + 创建 Ember Strike,先用基础字段确定费用、目标、分类与外观

字段
NameEmber Strike
DescriptionDeal 6 damage. Apply 1 Embermark.
Cost1
TypeSupport
RarityCommon
TargetSingle Enemy
TagsAttack
Keywords留空
UpgradeNone
IconStudy
TemplateSupport

Support 是卡牌 Type,用于分类并显示在卡面上;Attack 是独立的 Tag,供筛选和自定义规则识别攻击牌;Template = Support 则选择预览与运行时使用的卡牌预制体

Ember Strike 的基础字段、卡牌预览与尚未配置的 Behavior

右上角的 1 WarningBehavior Summary 中的 (no triggers) 都来自空行为图,卡牌基础数据已经完整,但打出后还不会结算,点击 Edit FlowGraph,建立玩法链

On Card Played → Deal Damage → Change Status
节点字段
Deal DamageTargetOpponent
Amount6
Ignore Armor关闭
Change StatusTargetOpponent
Amount1
ModeDelta
StatusEmbermark

Opponent 会解析为玩家选中的敌人,Deal Damage 将 6 点基础伤害送入伤害结算,Change Status 再增加 1 层 Embermark,玩法结果确定后,添加表现链

Play VFX → Play SFX → Show Floating Text
节点字段
Play VFXTargetOpponent
AnchorOn Unit
PrefabVFX_BurnIgnite
Lifetime0,自动
Play SFXClipMage2
Volume1
Show Floating TextTargetOpponent
ContentAmount
Amount切换为输入端口,连接 Deal Damage → Dealt
Include Sign开启
Custom Color关闭
Scale1
Duration1
Offset(0, 0, 0)

按照以下顺序把三个表现节点整理为 Play Effect

  1. Show Floating TextContent 设为 Amount,点击 Amount 右侧的小圆点切换为输入端口,再连接 Deal DamageDealt
  2. 暂时保持三个表现节点未分组,关闭 FlowGraph 窗口,再从 Ember Strike 点击 Edit FlowGraph 重新打开,使 Show Floating Text 根据 Dealt 的直接来源刷新为 Damage 样式
  3. 选中三个表现节点并按 Ctrl + G,此时 Dealt 数据连线会自动保留为 Group 边界端口
  4. 将默认的 Group 重命名为 Play Effect,双击进入组,再点击需要显示在外层的参数标签,暴露 PrefabClipInclude SignCustom ColorScaleDuration
  5. 返回父图,把 Change Status 的流程输出连接到 Play Effect 的流程输入
截图中的静态 Amount

两张 FlowGraph 截图记录的是静态 Amount = 6Amount = 3 布局,这两个数值分别对应卡牌与敌人 Deal Damage 的基础值

当前编辑器不再手动选择 Kind,按上述步骤新建时,画布会比截图多出一条 Deal Damage → Dealt 数据连线,Amount 也会读取扣除护甲和 Hook 修正后的实际伤害

Ember Strike 的完整 FlowGraph,玩法结算后进入 Play Effect 表现组

On Card PlayedPlay Effect 的路径已经完整连接,这张牌现在能够完成伤害、状态与表现结算,节点连接、Group 参数暴露与实际结算值的处理见流图编辑器,下一步则要把它加入卡组,让玩家能够在战斗中抽到

3. 把卡牌交给玩家,再补齐对手

卡组把可执行卡牌变成抽牌来源

切换到 Deck,点击列表上方的 + 创建 Ember Trial Deck,再把 Ember Strike 的 Copies 设为 10

字段
NameEmber Trial Deck
DescriptionTen Ember Strikes for the second-battle tutorial.
Tags留空
IconDeck_Warrior_Start
CardsEmber Strike × 10

Ember Trial Deck 包含一种卡牌与十份 Ember Strike

1 cards · 10 copies 表示卡组只有一个唯一卡牌条目,但共有十张运行时卡牌,本场起手抽 5 张、下一回合再抽 5 张时都只会得到 Ember Strike,卡组条目、Copies 与抽牌来源见卡组创作,这副卡组还需要成为玩家的 Starting Deck 才会真正进入战斗

玩家把卡组带入战斗

切换到 Player,点击列表上方的 + 创建 Trial Hero,并在 Deck 区域选择刚刚完成的 Ember Trial Deck

区域字段
BasicNameTrial Hero
DescriptionA tutorial player with a guaranteed Ember Strike draw.
Tags留空
VisualIconAvatar
TemplatePrefab
AttributesBase HP60
Base Energy3
DeckStarting DeckEmber Trial Deck
EnergyNameEnergy
Descriptiontutorial energy
IconEnergy

Trial Hero 具有 60 点生命、3 点基础能量,并使用 Ember Trial Deck

玩家预览、60 HP · 3 Energy 与十张卡牌的起始卡组共同完成了玩家侧配置,Starting Deck 决定实际进入战斗的牌库,Energy 区域只定义资源在界面中的名称、说明与图标,相关字段的完整说明见角色创作

敌人用意图绑定预告与行动

战斗还需要一个能够预告并执行行动的对手,切换到 Enemy,点击列表上方的 + 创建 Trial Dummy,先配置生命、强度层级与表现资产

字段
NameTrial Dummy
DescriptionA predictable tutorial enemy.
TierNormal
Tags留空
IconAvatar
TemplatePrefab
HP Min24
HP Max24

Trial Dummy 的基础字段已经完成,Behavior 与 Intents 尚未配置

当前的 24 HP 与角色预览只确定敌人的基础数据和外观,Behavior SummaryIntents 仍然为空,点击 Edit FlowGraph,用 Leaf Intent 把 Attack 预告与敌人回合实际执行的路径绑定在一起

On Enemy Behavior Start → Leaf Intent(Attack)→ Deal Damage → Change Status
节点字段
Leaf IntentIntentAttack
Deal DamageTargetOpponent
Amount3
Ignore Armor关闭
Change StatusTargetOpponent
Amount1
ModeDelta
StatusEmbermark

战斗开局会沿这条路径解析 Leaf Intent,并从后续 Deal Damage 提取数值 3,作为 Full 模式的 Attack 预告,敌人回合到来时,GCS 再执行已经规划的叶节点路径,对 Trial Hero 造成 3 点伤害并施加 1 层 Embermark

表现链会沿用卡牌已经建立的组织方式,只替换敌人的命中特效、音效与飘字数值

Play VFX → Play SFX → Show Floating Text
节点字段
Play VFXTargetOpponent
AnchorOn Unit
PrefabVFX_ImpactHit
Lifetime0,自动
Play SFXClipHit002
Volume1
Show Floating TextTargetOpponent
ContentAmount
Amount切换为输入端口,连接 Deal Damage → Dealt
Include Sign开启
Custom Color关闭
Scale1
Duration1
Offset(0, 0, 0)

Deal Damage → Dealt 接入飘字的 Amount 后,暂时保持三个表现节点未分组,关闭 FlowGraph 窗口,再从 Trial Dummy 点击 Edit FlowGraph 重新打开,将三个表现节点封装为 Play Effect

双击进入组并暴露 PrefabClipScaleDurationDealt 连线会自动形成 Amount 边界端口;Include SignCustom Color 保持组内配置,返回父图后,把 Change Status 的流程输出接入该组,飘字便会使用实际伤害值

Trial Dummy 的完整 FlowGraph,Attack 意图连接伤害、状态与 Play Effect

至此,Leaf Intent 与后续伤害、状态和表现节点已经处于同一条路径,Trial HeroTrial Dummy 也分别具备开局所需的卡组、属性和行为,敌人意图与行为图的更多组合见敌人创作常用敌人模式,双方内容就绪后便可以由 Encounter 汇总整场战斗

4. 由 Encounter 汇总整场战斗

切换到 Encounter,点击列表上方的 + 创建 Ember Trial,将前面完成的玩家、敌人和卡组分别放入 Player、Enemy Units 与 Reward Deck,再配置起手、抽牌、能量和回合规则

区域字段
BasicNameEmber Trial
DescriptionA complete second-battle tutorial encounter.
DifficultyNormal
Tags留空
VisualIconBackground,在初始化出的战斗场景中作为战斗背景显示
PlayerPlayerTrial Hero
Enemy UnitsEnemy UnitsTrial Dummy × 1
Reward DeckReward DeckEmber Trial Deck
Battle RulesStarting Hand Size5
Draw Per Turn5
Max Hand Size10
Starting Energy0
Card Reward Count3
Armor DecayResetOnTurnStart
Hand DiscardDiscardOnTurnEnd
Enemy Intent DisplayFull
Animation Gap0.28

这组规则中有四项容易因字段名称而产生误解:

  • Starting Energy = 0 表示 Encounter 不覆盖玩家的基础能量,运行时会回退到 Trial HeroBase 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 不会改变节点执行或阶段推进的间隔

Ember Trial 已连接 Trial Hero、Trial Dummy、奖励卡组与完整战斗规则

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

Encounter Bootstrap 已选择 Ember Trial,并显示 Ready — starts 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 Hero60/60Trial Dummy24/24,能量为 3/3;画面中还应有 5 张 Ember Strike 手牌、5 张抽牌、0 张弃牌,以及敌人上方数值为 3 的 Attack

Ember Trial 的开局状态,玩家、敌人、手牌、能量与 Attack 3 意图均已建立

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

Ember Strike 正在选择 Trial Dummy,目标箭头与选中角标已经出现

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

Ember Strike 结算后,能量降至 2,敌人为 18/24,并获得 1 层 Embermark

结算完成后,能量从 3 降到 2,手牌从 5 张变为 4 张,弃牌堆从 0 变为 1,敌人生命从 24 降到 18,状态栏出现 1 层 Embermark,费用、目标、伤害、状态与牌堆移动应在同一次出牌中生效

点击 End TurnDiscardOnTurnEnd 会把剩余 4 张手牌移入弃牌堆,Trial Dummy 随后执行 Attack 3,对玩家造成 3 点伤害并施加 1 层 Embermark,行动完成后,系统先解析下一次 Attack 3,再进入第二个玩家回合,补满 3 点能量并抽取剩余 5 张卡牌

敌人行动结束并进入第二回合,玩家为 57/60,双方各有 1 层 Embermark,能量与手牌已经刷新

第二个玩家回合开始时,Trial Hero 变为 57/60,并带有 1 层 Embermark,对应敌人刚刚执行的伤害与状态路径,此时能量恢复为 3/3,手牌、抽牌堆与弃牌堆依次为 505,而敌人身上先前施加的 Embermark 仍保持 1 层,也与 Decay Rule = Never 和空 Behavior 完全一致

最后检查 Console,若没有 GCS 报错,说明数据库激活、内容引用、两张 FlowGraph、Encounter 汇总和 Bootstrap 启动均已通过验证

至此,数据库激活、内容引用、两张 FlowGraph、Encounter 汇总与 Bootstrap 启动都已经得到可见结果,恭喜你已经完成了第一个完整的战斗场景的制作

抽牌、弃牌、敌方阶段与下一回合的完整推进顺序见战斗循环