卡牌创作
在一份 GameCard 资产中配置卡牌数据、卡面和 Behavior,并验证它在战斗中的实际结果
要让卡牌进入卡组、要求正确的玩家操作并在战斗中按预期结算,需要把卡牌数据、卡面与 Behavior 保存在同一份 GameCard 资产中,开始创作前,场景需要由 GameCardManager 启用至少一个 Card Database,数据库配置决定 Game Card Editor 能够列出和编辑哪些数据库的卡牌
打开 Game Card Editor
Tools > TinyGiants > GCS > Game Card Editor
在窗口顶部选择 Card,当前项目的卡牌资产、编辑字段与检查结果会进入同一个三栏工作区

上图把卡牌的资产定位、规则编辑和结果检查放在同一窗口中,左侧 List 决定当前编辑对象,中间 Inspector 保存 Basic、Visual 与 Behavior,右侧 Preview 随当前选择同步显示数据摘要、模板渲染、行为主路径与外部引用,后续所有操作都以 List 中的当前选择为起点,因此要先确认卡牌所在的 Card Database,再创建、复制或定位具体资产
选择待编辑的卡牌
列表操作
| 操作 | 使用方式与结果 |
|---|---|
| 选择数据库 | 在列表顶部选择 Card Database,后续创建、粘贴和排序都作用于当前数据库 |
| 创建 | + 会在当前数据库内创建以 NewCard 为基名的 GameCard 子资产,同名资产存在时自动追加序号,初始值为 1 Cost、Common 与 Target = None |
| 复制 | 复制按钮会完整复制当前卡牌;相近卡牌共用分类、视觉模板或 Behavior 结构时,可以从副本继续修改,保留已经确认的基础配置 |
| 删除 | − 会在确认后删除所选资产 |
| 搜索与筛选 | 搜索框按卡牌显示名筛选,Name 非空时使用该值,留空时回退到资产名;Type、Rarity、Keywords 与 Tags 可以继续缩小范围 |
| 排序与拖动 | 排序按钮在数据库原顺序、名称升序与名称降序之间切换;拖动卡牌行只改变数据库中的创作顺序,不会改变起手或抽牌顺序 |
| 批量操作 | 使用 Ctrl/Cmd 或 Shift 多选卡牌,再执行 Duplicate、Tag +、Tag − 或 Delete |
| 跨数据库复制 | Ctrl/Cmd+C 复制当前选中的一张卡牌,切换到另一个已启用的 Card Database 后,使用 Ctrl/Cmd+V 粘贴副本 |

列表顶部显示的 80 对应随包 PresetCardDatabase 中可直接检查和修改的 80 张卡牌,它们覆盖 5 套 Template、5 个内置关键词与 4 条直接升级关系,完整清单见 Demo 内容索引
配置卡牌的基础规则
Basic 会把玩家需要识别的信息、出牌交互与项目分类集中到同一组字段中
| 字段 | 配置内容 |
|---|---|
| Name | 玩家看到的名称,非空值也会同步成为卡牌子资产名 |
| Description | 卡面与 Display 使用的规则文本,输入 { 会列出已注册的 Description Token,最终内容必须与 Behavior 一致 |
| Cost | 基础能量费用,编辑器会限制为 0 以上,战斗中的实际费用仍以 Hook 与费用规则计算结果为准 |
| Type | 用于着色、筛选和项目逻辑的分类,可以选择当前项目已有值,也可以输入自定义值 |
| Rarity | 可以选择当前项目已有值或输入自定义值,空值会回到 Common |
| Target | 出牌 UI 收集目标的方式,必须与 Behavior 实际解析范围保持一致 |
| Tags | 项目自定义标签,本身没有内置玩法,只有被 FlowGraph 或代码读取后才会产生规则作用 |
| Keywords | 来自 CardTagRegistry 的注册关键词,五个内置项具有运行时规则,自定义项需要项目逻辑消费其 ID |
| Upgrade | 当前卡牌的直接升级体,None 表示没有升级关系 |

完成图中配置后,Decapitate 是一张费用为 3、类型为 Basic、稀有度为 Common 的 Attack 卡牌,玩家打出它时需要选择一个敌人;具体结算效果仍由 Behavior 决定
保持 Target 与 Behavior 的目标范围一致
Target 仅决定出牌 UI 如何收集目标,它不会为 Behavior 创建目标,运行时也不会仅凭该字段完成目标合法性校验,最终的作用对象仍由 FlowGraph 节点的输入端口或 UnitSource 决定,例如 Target 使用 Single Enemy 而 Behavior 解析 All Enemies 时,UI 仍会要求玩家选择一个敌人,但结算会忽略这次选择并作用于所有敌人,四种 Target、UnitSource、已连接 Target Port、Card Source、Selector 与空结果的完整边界见目标选择
配置卡牌关键词
出牌交互确定后,Keywords 会继续决定卡牌在起手、手牌、结算与回合结束时怎样流转
| Keyword | 运行时规则 |
|---|---|
Exhaust | 主动打出并执行 On Card Played 后进入消耗堆,同时触发 On Card Exhausted |
Ethereal | 回合结束时仍在手牌中会先被消耗,与 Retain 同时存在时由 Ethereal 优先 |
Retain | 当规则会在回合结束弃掉手牌时保留该牌并触发 On Card Retained,若遭遇规则本就保留全部手牌,未带该词条的牌也会留下 |
Innate | 洗牌后优先进入起手范围,数量超过起手容量时会随机选择能够进入起手的部分 |
Unplayable | 不能被主动打出,但仍可抽取、保留,并通过其他生命周期入口执行 Behavior |
Keywords 选择器会读取 CardTagRegistry,项目可以注册新的 Card Tag 并让它出现在同一菜单中,扩展方式见卡牌类型、标签与描述 Token
基础规则确定后,在 Visual 中绑定 Icon 与 Template,供列表、Preview 和项目表现层使用
配置卡面资源
为 Decapitate 绑定插画 Sprite 与 Basic Template 后,Game Card Editor 才能同时检查紧凑信息卡与完整卡面
Icon 会进入 List 与 Display,Template 则决定 Render 实例化哪套卡面结构,缺少 Template 时 Render 只会显示绑定提示,不会生成可用的占位卡牌
Render 只会在 Template 根对象的直接子级中查找约定名称
| 子对象与组件 | 预览行为 |
|---|---|
Artwork + SpriteRenderer | 写入当前 Icon |
Energy、Type、Name、Description + TMP_Text | 写入对应的静态文本 |
Glow + GameObject | 鼠标悬停 Render 时切换显示 |
当缺少约定对象或组件时,Render 会直接跳过而不会报告校验错误,因此,这套约定只负责 Game Card Editor 的静态模板预览,项目或 Demo 的运行时卡面仍需由表现层完成实例化与数据绑定,具体接入方式请见自定义 UI 集成
静态卡面完成后,就该在 Behavior 中编排卡牌的实际结算规则了
编排卡牌 Behavior
点击 Edit FlowGraph 会打开当前卡牌内嵌的 Behavior,在这里编辑卡牌自身持有的行为:
按钮下方的 OnCardPlayed 标签确认当前 Behavior 至少包含一个出牌入口,点击标签或按钮进入 FlowGraph Editor
以下图为例,Poison Arrow 把同一入口扩展为伤害、命中表现、状态变化与施毒表现,Description 中的两项规则因此都能在 Behavior 中找到对应节点

On Card Played 先执行 Deal Damage,对当前 Opponent 造成 3 点伤害,第一组 Play Effect 播放命中反馈,Change Status 再施加 2 层 Poison,最后一组 Play Effect 播放状态反馈,Description 应与这条路径保持一致,例如 Deal 3 damage. Apply 2 Poison.
更复杂的分支、循环与组合可以继续参考 FlowGraph 模型和常见卡牌配方
完成 Behavior 检查后,回到 Game Card Editor 并重新选择 Decapitate,右侧 Preview 会从静态数据、模板结构与入口主路径三个层面检查这张卡
检查卡牌预览
Display:检查静态数据
Display 会把 Icon、Name、原始 Description、EnergyCost、Type、Rarity、Tags 与 Keywords 组合成紧凑信息卡,它不会显示 Target、Upgrade、动态描述或战斗中的有效费用

Render:检查模板结构
Display 只检查数据摘要,Render 会在隔离预览中实例化 Template,以便你可以直接在窗口内观察它

卡面中的费用 3、插画、名称 Decapitate 与规则文本已经进入 Basic Template,这能确认静态模板结构与排版,但 Render 对 Description 只会用样例值替换 {Damage}、{Block}、{Heal} 与 {Stacks:Burn},自定义 Token 和真实战斗数值仍要在运行时通过 GCSApi.FormatDescription 检查
Behavior Summary:检查入口主路径
模板结构确认后,Behavior Summary 会从每个顶层 Entry 的 Out 端口向后追踪一条直链,最多显示 8 个节点,用来快速辨认入口与主路径
OnCardPlayed → DealDamage → Group 说明当前卡牌拥有一条从出牌入口进入伤害与表现组的主路径,而分支、其他控制端口与 Group 内部细节不会在这里完整展开
三个 Preview 面板分别确认了静态数据、模板结构和 Behavior 主路径,修改共享卡牌前,还要检查它在已启用内容中的引用范围
检查资产引用
Used By 会扫描当前场景 GameCardManager 启用的数据库,并列出能够识别的卡组条目、直接升级关系与部分 Behavior 引用

如上图所示,Decapitate 被 Bloodforged Fury、Cataclysm Codex、Apex Predator 与 Divine Ascension 四个 Deck 收录,Heavy Strike 的直接升级体也指向它,修改或删除这张卡会同时影响这些内容:
- Deck 引用会包含卡牌份数,Card 引用会显示直接升级关系,Behavior 扫描会检查已启用 Card、Status 与 Enemy 的公开字段
- 点击条目可以在 Game Card Editor 的对应模式中打开所属资产
Used By 是当前启用数据库内的辅助扫描,不覆盖未启用数据库、场景、Prefab、项目代码、私有字段、运行时动态查找或自定义间接引用,也不会阻止删除,涉及公开资产或自定义代码时仍需执行项目级引用检查
处理校验问题
| 级别 | 触发条件 |
|---|---|
| Error | Name 为空 |
| Warning | Type 为空、Description 为空、Template 缺失、Behavior 没有节点,或 FlowGraph 存在结构问题 |
右上角 Issue Badge 统计当前所选 Card Database 中的全部问题,打开列表后可以跳转到对应字段或 FlowGraph,不过Target、Description 与 Behavior 的一致性、升级循环、Template 子对象约定和真实战斗结果都不属于自动校验范围,清除 Issue 后仍需继续人工复核
人工检查清单
-
列表行能够仅凭图标、名称、分类、费用与标签辨认卡牌
-
Target、Description 与 Behavior 表达同一项结算 -
Display 数据完整,Render 中没有缺图、错位或漏字
-
Behavior Summary 包含预期入口,原图中的参数与分支已经复核
-
Used By 中的已知引用符合预期,项目级间接引用已经另行检查
静态数据、模板、行为与引用全部通过检查后,再进入 Play Mode,用真实战斗来验证费用、目标、数值、状态与牌堆流转是否成立
在 Play Mode 验证结算
在随包 Demo 的第一场战斗中打出 Poison Arrow,同一次出牌会消耗 1 点能量,对 Plague Stalker 造成 3 点伤害,施加 2 层 Poison,再把卡牌移入弃牌堆

敌人生命值从 16 降至 13,Poison 从 0 增至 2,对应 Behavior 中的伤害和状态节点,玩家能量从 3 降至 2,弃牌堆从 0 增至 1,说明费用支付和结算后的移牌流程也已生效
结果与预期不一致时,可以在 Game Card Monitor中同时检查当前手牌、四个牌堆、阶段、单位状态与事件时间线,再回到产生差异的字段或节点
项目 UI 应从实时 CardInstance 读取卡面、有效费用与格式化描述,并通过受支持的 API 或 FlowGraph 节点修改牌堆,牌堆行为见卡牌与牌堆生命周期,代码入口见 API 使用指南
完成校验和 Play Mode 验证后,这张卡已经具备完整数据、可见卡面、可执行 Behavior 和明确的引用关系,继续阅读卡组创作,把卡牌与份数组装成起始卡组或奖励卡池