卡组创作
卡组保存卡牌引用和份数,可以作为初始牌组,也可以作为奖励卡池
完成卡牌创作后,每张通过数据、卡面与 Behavior 验证的 GameCard 都可以加入 GameDeck
一条 DeckEntry 只保存一张卡牌的直接引用及其 Copies,多个条目共同组成玩家或遭遇战可以引用的卡组资产
先在当前场景的 GameCardManager 中启用至少一个 Deck Database,数据库配置决定 Game Card Editor 能够列出、创建和编辑哪些卡组
打开 Game Card Editor
Tools > TinyGiants > GCS > Game Card Editor
在窗口顶部选择 Deck,再从左侧定位要编辑的卡组

上图呈现了 Iron Resolve 从资产选择到构成核对的完整创作视图,左侧 List 确定当前卡组,中间 Inspector 设置身份并组装卡牌,右侧 Preview 会把这些条目即时换算为卡牌数量、类型、标签与费用结构
同一份 GameDeck 可以被玩家引用为 Starting Deck,也可以被遭遇战引用为 Reward Deck,两个用途共用左侧选中的资产、Inspector 中的卡牌构成以及 Preview 的检查结果
从 List 选择卡组
先在 Database 中选择目标 Deck Database,+ 会创建以 NewDeck 为基名的子资产,− 会在确认后删除当前卡组,复制按钮则会保留现有字段和卡牌构成并创建副本
新建卡组的 Name 初始为空,创建后先填写显示名称
复制卡组会暂时沿用原 Name,副本需要改成自己的名称,非空 Name 会同步重命名子资产,随后列表显示名与搜索、排序使用的子资产名保持一致
搜索框与名称排序读取卡组子资产名,Tags 筛选读取 GameDeck.Tags
排序按钮会在数据库原顺序、名称升序与名称降序之间切换,拖动列表行只会改变数据库中的创作顺序
需要批量整理时,先用 Ctrl/Cmd 或 Shift 多选卡组,再从批处理栏执行 Duplicate、Tag +、Tag − 或 Delete
Ctrl/Cmd+C 会复制当前选中的一份卡组,切换到另一个已启用的 Deck Database 后,Ctrl/Cmd+V 会把副本粘贴到该数据库,其他列表交互见 Game Card Editor
列表行只统计 Card 引用有效的 DeckEntry,并累加这些条目的 Copies,不用打开 Inspector 就能比较不同卡组的条目数与总份数

当前 PresetDeckDatabase 包含 16 份随包卡组,选中的 Iron Resolve 由 7 个卡牌条目组成,共计 17 份,其他卡组及其用途可以在 Demo 内容索引中继续核对
选中 Iron Resolve 后,先在 Basic 与 Visual 中补全名称、说明、标签和图标,Preview 会使用名称、说明与图标生成卡组卡片,Tags 则用于 List 筛选和项目分类
用 Basic 与 Visual 建立卡组身份
Basic
Basic 保存卡组自身的名称、说明与项目分类,这些数据负责识别和查找卡组,不会替代卡牌条目,也不会直接改变抽牌行为
| 字段 | 配置内容 |
|---|---|
| Name | 编辑器列表与 Preview 使用的显示名称,非空修改会同步到子资产名,玩家卡组选择器读取同步后的子资产名,项目 UI 可以自行读取该字段 |
| Description | 说明卡组定位、预期打法或奖励用途的简短文本 |
| Tags | 供列表筛选和项目分类使用的卡组标签,GCS 不会自动为标签附加战斗规则 |
将 Name 设为 Iron Resolve,保留新兵初始套牌的说明,再添加 Warrior 与 Novice

Iron Resolve 的名称、说明和两枚标签已经与战士新兵套牌一致,接着用 Visual 绑定编辑器能够显示、项目 UI 可以读取的卡组图标
Visual
Icon 会直接出现在编辑器的卡组列表、Display 预览与 Player 模式 Deck 卡片中,项目 UI 可以读取这个字段自行显示,GCS 不会自动把它绘制到自定义界面
这个图标只负责卡组层面的呈现,不会替换卡背、卡牌 Template 或单张卡牌插画
为 Iron Resolve 选择 Deck_Warrior_Start
卡组身份与图标完成后,列表和 Preview 已经能够稳定显示 Iron Resolve,Cards 中的引用与份数则决定这份卡组包含哪些卡牌
用 Cards 组装卡牌与份数
点击 Cards 标题右侧的编辑图标会打开 Edit Deck 选择器,左键点击卡牌会增加一份,右键点击会减少一份,份数降到 0 时该条目会从卡组中移除
选择器自带名称搜索,并把当前已选卡牌排在各自数据库分组的前部
同时启用多个非空 Card Database 时,卡牌会按数据库分组,只有一个数据库时会展开成平铺列表,没有可用数据库时才会回退查找项目中的全部 GameCard
回到 Inspector 后,每个卡牌块都会显示图标、名称、Copies 与基础 EnergyCost,左键点击卡牌块可以直接切换到 Card 并继续编辑对应资产

Iron Resolve 使用 4 份 Strike、4 份 Defend、各 2 份 Insight、Bandage、Slash 与 Shield Bash,再加入 1 份 Channel,7 个条目合计 17 份
Cards 区没有卡牌重排控制,Entries 的保存顺序也不会决定抽牌顺序
战斗开始时抽牌堆会先洗牌,带有 Innate 的卡牌会在洗牌后获得起手优先级
起始手牌、抽牌方向与弃牌堆回洗规则见卡牌、手牌与牌堆
同一份 GameDeck 的两种创作用途
卡牌引用与份数写入同一份 GameDeck,但引用这份资产的位置会决定 Copies 在运行时的含义
| 用途 | Copies 与运行结果 |
|---|---|
| Starting Deck | 持久 Master Deck 为空时,Copies 决定生成的战斗卡牌实例数,随后建立并洗牌初始抽牌堆 |
| Reward Deck | Copies 作为对应 DeckEntry 的抽取权重,候选按条目无放回抽取,选中的卡牌会向 Master Deck 增加 1 张 |
GamePlayerUnit.StartingDeck 保存角色的起始卡组引用,GameEncounter.RewardDeck 与 BattleRules.CardRewardCount 保存遭遇战的奖励卡组引用和候选请求数
BattleRules.CardRewardCount 默认请求 3 项,运行时最低按 1 计算,最终数量不会超过有效条目数
卡组引用缺失、卡组为空或没有有效卡牌时,奖励候选可以为 0 项
在任何一处引用这份卡组之前,Preview 都可以先检查它自身的静态构成是否符合预期,字段的完整配置分别见玩家创作和遭遇战创作
用 Preview 核对卡组构成
Preview 会在卡牌引用或份数变化后重新计算,它显示的是 GameDeck 当前保存的创作数据,不会模拟升级、费用修正、FlowGraph、Hook 或实际抽牌结果
Display
Display 把 Icon、Name 与 Description 组合成可见卡组卡片,并用 Cards 显示不同 GameCard 引用数量,用 Copies 显示所有有效条目的份数总和

Cards 7 与 Copies 17 和前面的构成一致,Edit Deck 选择器会把同一张卡牌的全部份数保存在一个条目中
如果外部序列化或旧资产留下重复引用,Preview 的 Cards 会按 GameCard 去重,List 行仍会统计每个 Card 引用有效的条目
身份与总数已经对齐后,Distribution 会说明这 17 份卡牌由哪些类型、稀有度与卡牌标签组成
Distribution
Distribution 按份数读取每张卡牌的 Type、Rarity 与 Tags,一张卡有 4 份,就会为对应分类贡献 4 次,它不读取卡组自己的 GameDeck.Tags,也不会统计卡牌 Keywords

Iron Resolve 包含 Basic 8、Skill 4 与 Support 5,17 份卡牌全部为 Common,标签则集中在 Attack 8、Armor 4、Card 2、HP 2 与 Energy 1
这些分类说明了卡组由什么组成,实际每回合能否使用这些卡牌还取决于基础费用在 17 份卡牌中的分布
Energy Bar
Energy Bar 按每张卡牌创作时保存的基础 EnergyCost 与 Copies 统计
0 至 4 费分别计入同名柱,5 费及以上都计入标记为 5 的最后一柱,下方再归纳为 Low(0-1)、Mid(2-3)与 High(4+)
这项统计不会计算升级形态、Master Deck 的 CostDelta、Hook 修改后的有效费用或遭遇战规则,费用曲线需要与玩家的每回合能量和实际战斗流程一起判断

当前卡组由 5 份 0 费牌和 12 份 1 费牌组成,17 份全部落在 Low,其中 1 费牌占比已经达到 Insights 的提示阈值
Insights
Insights 使用固定阈值检查当前静态统计,它不会读取卡牌 Behavior,也不会判断项目中的真实连携逻辑
| 提示 | 触发条件 |
|---|---|
Cost N dominates | 任一费用桶占总份数的比例达到 50% |
No low-cost cards | 总份数至少为 6,并且没有 0-1 费卡牌 |
No high-cost cards | 总份数至少为 6,并且没有 4+ 费卡牌 |
Type-focused | 单一 Type 占总份数的比例达到 70% |
Tag only N cards | 任一卡牌标签出现 2-4 次,面板会以 5 次作为固定提示阈值 |
Curve looks balanced | 总份数至少为 6,并且没有命中其他提示 |

Cost 1 在 Iron Resolve 中占 71%,卡组又没有 4+ 费牌,这两项费用结果会产生前两条提示
Armor 4、Card 2 与 HP 2 都处于 2-4 次区间,因此又产生 3 条标签提示
面板合计显示 5 条启发式提示,用于复核设计取向,不属于结构校验错误
当总份数少于 6 且没有命中其他规则时,Insights 不会出现,Preview 核对完成后再处理 Validation 发现的数据结构问题
清除 Validation 问题
Game Card Editor 的 Issue Badge 统计当前所选 Deck Database 中的全部卡组,不只统计当前正在查看的 Iron Resolve
| 级别 | 触发条件 |
|---|---|
| Error | Name 为空 |
| Warning | Description 为空 |
| Warning | Entries 为 null 或条目数量为 0 |
| Error | 任一非空 DeckEntry 的 Card 引用为空 |
| Error | 任一 DeckEntry.Copies 小于 1 |
这些问题不会阻止保存、删除或进入 Play Mode,Issue 条目只用于定位到存在问题的卡组或字段
校验未覆盖的内容需要按职责另行检查
| 未检查范围 | 需要人工确认的内容 |
|---|---|
| 卡组呈现 | Icon 与卡组 Tags 是否符合项目约定 |
| 卡牌构成 | 是否存在重复条目,所引用卡牌自身是否完整 |
| 使用方式 | Starting Deck 与 Reward Deck 的分配是否符合预期 |
| 设计结果 | 费用曲线、实际抽牌与战斗结果是否符合设计预期 |
自动检查的边界与 Issue 跳转方式见 Game Card Editor
结构问题清除后,打开 Used By,确认这份 GameDeck 当前被引用为 Starting Deck 还是 Reward Deck
用 Used By 确认卡组去向
Used By 会扫描当前场景 GameCardManager 已启用的 Player Unit Database 与 Encounter Database,玩家条目对应 StartingDeck,遭遇战条目对应 RewardDeck
这项检查不会覆盖未启用数据库、其他场景或 Prefab,也不会扫描项目代码、私有字段、运行时查找与自定义间接引用
Used By 不会在删除卡组时提供引用保护,替换或删除资产前仍要在这些范围内检查项目级引用

图中的 Squire 已经通过 StartingDeck 字段引用 Iron Resolve,战斗运行时不会直接把这份 GameDeck 当作实时牌堆,而是先确定持久卡组来源,再为本场战斗创建 CardInstance
从 GameDeck 进入 Master Deck 与战斗牌堆
这条转换链包含三个职责不同的层级
- 创作资产
GameDeck保存直接GameCard引用与Copies,可以被玩家或遭遇战复用 - 持久记录
MasterDeckEntry保存单张卡牌的稳定 GUID、升级状态与CostDelta,一条记录代表跨战斗 Run 卡组中的一张卡牌 - 战斗实例
CardInstance保存实例 ID、当前卡牌定义、升级状态与费用修正,战斗开始后进入手牌、抽牌堆、弃牌堆或消耗堆
持久 Master Deck 为空时,GCS 会按照 Squire.StartingDeck 中各条目的 Copies 临时生成对应数量的 MasterDeckEntry,再用这些条目建立战斗牌堆
Master Deck 已经包含条目时,本场战斗会直接使用其中的卡牌,不再加入 Starting Deck 的内容
Starting Deck 的回退结果不会自动写回持久 Master Deck,多场战斗的 Run 应当在开始时按所选 Starting Deck 初始化条目,并在首场战斗前调用 GCSApi.SetMasterDeck
战斗开始时,GCS 会从当前 Encounter 的 Player Unit 所引用的 Starting Deck 以及 Encounter 自身的 Reward Deck 收集基础 GameCard,并用它们解析 Master Deck 中的 CardGuid
每个 MasterDeckEntry.CardGuid 对应的基础卡牌都必须直接出现在这两份卡组之一
无法匹配的条目会被跳过,升级形态可以通过基础卡牌的 UpgradedVariant 解析,无需单独加入卡组
GCSApi 为创作卡组、持久 Run 与实时牌堆提供对应入口
- 当前启用的卡组内容:
ActiveDeckDatabases()、Decks()、FindDeck(guid) - 持久 Master Deck:
GetMasterDeck()、SetMasterDeck()、AddCardToMasterDeck()、RemoveCardFromMasterDeck()、UpgradeCardInMasterDeck()、ClearMasterDeck() - 实时战斗牌堆:
Hand()、DrawPile()、DiscardPile()、ExhaustPile() - 战后奖励:
OnBattleRewardOffered()、ApplyReward()、SkipReward()
当 GCSApi.Manager 非空时,Decks() 每次调用都会新建列表并汇总已启用数据库中的卡组,频繁读取时应当缓存结果
各入口的参数、返回值与调用时机见 GCSApi 使用指南
从起始手牌到战后奖励的完整流程可以在第一场战斗中直接运行
在 Game Card Editor 顶部切换到 Player 并选择 Squire,保留已经绑定的 Iron Resolve
再按玩家创作补全生命、能量、战斗预制体与遭遇战依赖,完成后这个玩家角色就可以带着当前卡组进入遭遇战