卡牌创作
把身份、费用、目标、卡面与 Behavior 收进同一份可运行、可验证的 GameCard 资产
完成目标选择后,一张卡还需要在同一份 GameCard 资产中保存名称、费用、分类、关键词、升级关系、卡面与 Behavior,这些数据共同决定卡牌进入卡组和战斗后的身份、交互、表现与结算
当前场景需要先由 GameCardManager 启用至少一个 Card Database,数据库配置决定 Game Card Editor 能够列出和编辑哪些卡牌
打开 Game Card Editor
Tools > TinyGiants > GCS > Game Card Editor
在窗口顶部选择 Card,当前项目的卡牌资产、编辑字段与检查结果会进入同一个三栏工作区

上图把一张卡从资产定位、规则编辑到结果检查的完整创作路径放在同一窗口中,左侧 List 决定当前编辑对象,中间 Inspector 保存 Basic、Visual 与 Behavior,右侧 Preview 随当前选择同步显示数据摘要、模板渲染、行为主路径与外部引用
左侧选择是后续编辑与检查的共同起点,先确定卡牌所在的 Card Database,再创建、复制或定位具体资产
从 List 选择卡牌
先在列表顶部选择 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 与 Ctrl/Cmd+V 则会复制当前选中的一张卡牌,可以把它粘贴到另一个已启用的 Card Database

列表行已经同时给出图标、名称、类型、稀有度、费用与标签标记,图中选中的 Strike 因而不必打开 Inspector 也能被快速辨认
列表顶部显示的 80 对应随包 PresetCardDatabase 中可直接检查和修改的 80 张卡牌,它们覆盖 5 套 Template、5 个内置关键词与 4 条直接升级关系,完整清单可以在 Demo 内容索引中继续查阅
选择同一列表中的 Decapitate 后,中间与右侧会立即切换到这张卡的完整配置,Basic 会先确定它的身份、费用与出牌规则
用 Basic 建立卡牌规则
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 Cost、Basic、Common 的 Attack 卡牌,玩家需要先选择一个敌人,卡牌本身没有 Keyword 与升级目标,这组静态规则已经明确了如何出牌,但实际效果仍由 Behavior 决定
让 Target 与 Behavior 表达同一目标
Target 只约定出牌 UI 怎样收集目标,不会替 Behavior 创建目标,运行时也不会仅根据该字段完成目标合法性校验,最终作用对象仍由 FlowGraph 节点的输入端口或 UnitSource 决定
若 Target 使用 Single Enemy,而 Behavior 解析 All Enemies,UI 会要求玩家选择一个敌人,但实际结果却忽略这次选择,四种 Target、UnitSource、已连接 Target Port、Card Source、Selector 与空结果的完整边界统一见目标选择
用 Keywords 改变卡牌生命周期
出牌交互确定后,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 和项目表现层使用
用 Visual 绑定卡面
为 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,这个字段保存 GameEffectFlowGraph 数据,编辑的是卡牌自身持有的行为,不是选择一张外部 FlowGraph 资产
按钮下方的 OnCardPlayed 标签确认当前 Behavior 至少包含一个出牌入口,点击标签或按钮都会进入 FlowGraph Editor,节点的控制连接决定执行顺序,画布上的左右位置只负责保持图形可读
Poison Arrow 把同一入口扩展为伤害、命中表现、状态变化与施毒表现,Description 中的两项规则因此都能在 Behavior 中找到对应节点

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

Decapitate 的图标、名称、分类、稀有度、规则文本、基础费用与 Attack 标签已经在同一层级中完整出现,这说明 Display 正确读取了 Basic 与 Icon 数据,但还不能证明 Template 的结构和排版正确
Render 检查模板结构
Display 只检查数据摘要,Render 会在隔离预览中实例化 Template,并把当前卡牌数据写入能够识别的子对象

卡面中的费用 3、插画、名称 Decapitate 与规则文本已经进入 Basic Template,这能确认静态模板结构与排版,不代表运行时升级形态、Hook 后费用、可支付状态或动态 Description 已经正确
Render 对 Description 只会用样例值替换 {Damage}、{Block}、{Heal} 与 {Stacks:Burn},自定义 Token 和真实战斗数值需要在运行时通过 GCSApi.FormatDescription 检查
Behavior Summary 检查入口主路径
模板结构确认后,Behavior Summary 会从每个顶层 Entry 的 Out 端口向后追踪一条直链,最多显示 8 个节点,用来快速辨认入口与主路径
OnCardPlayed → DealDamage → Group 说明当前卡牌拥有一条从出牌入口进入伤害与表现组的主路径,分支、其他控制端口与 Group 内部细节不会在这里完整展开,没有入口或摘要与预期不符时仍要返回 FlowGraph Editor 检查原图
三个 Preview 面板已经完成当前资产内部的静态检查,修改共享卡牌之前还需要确认它在已启用内容中的引用范围
用 Used By 检查已知引用
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、项目代码、私有字段、运行时动态查找或自定义间接引用,也不会阻止删除,涉及公开资产或自定义代码时仍需执行项目级引用检查
当前场景没有 GameCardManager 时 Used By 无法建立这组引用结果,需要先打开已经完成数据库配置的场景
引用范围确认后,编辑器校验会继续检查当前 Card Database 中能够自动发现的结构问题
清除编辑器校验问题
| 级别 | 触发条件 |
|---|---|
| Error | Name 为空 |
| Warning | Type 为空、Description 为空、Template 缺失、Behavior 没有节点,或 FlowGraph 存在结构问题 |
右上角 Issue Badge 统计当前所选 Card Database 中的全部问题,不只统计当前卡牌,打开列表后可以跳转到对应字段或 FlowGraph
这些 Issue 不会阻止保存、删除或进入 Play Mode
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,可以先使用无战斗时返回空列表的 GCSApi.Hand()、DrawPile()、DiscardPile() 与 ExhaustPile() 获取牌堆,再从实例解析当前升级定义、有效费用与格式化描述
var hand = GCSApi.Hand();
if (hand.Count == 0)
return;
CardInstance instance = hand[0];
GameCard card = GCSApi.GetActiveCard(instance);
int cost = GCSApi.GetEffectiveEnergyCost(instance);
string description = GCSApi.FormatDescription(card, instance);
这组读取结果才是运行时 UI 应显示的卡牌状态,牌堆变化则应交给 GCSApi.DrawCards、GCSApi.AddCardToHand、GCSApi.MoveCardToPile、GCSApi.ShuffleDrawPile 或对应 FlowGraph 节点完成,完整边界见卡牌、手牌与牌堆和 GCSApi 使用指南
通过校验并完成 Play Mode 验证后,这张卡已经具备完整数据、可见卡面、可执行 Behavior 与明确引用关系,卡组创作会继续用卡牌引用与份数组装初始牌组和奖励卡池