FlowGraph 概览
FlowGraph 是 GCS 的可视化行为层。每个卡牌效果、状态反应和敌人回合,都是一张内嵌在所属资产里的节点图。
第一次打开 FlowGraph 窗口之前先读这一页。它说明宿主、入口、Hook 和两种连线,是后续页面的基础。FlowGraph 用来描述战斗行为:当战斗中某个时机发生时,当前内容应该执行哪些动作。创作者不需要为每张卡单独编写运行时脚本,只需要把行为组织成节点和连线,GCS 会在对应时机执行这张图。

上图是 demo 自带的 Poison Arrow。它对选中的敌人造成 3 点伤害,播放命中反馈(一个打包了 VFX、音效、浮动文字和镜头震动的 Group 节点),再叠加 2 层 Poison,最后以毒云特效收尾。这张图定义了卡牌的完整运行行为,不需要为这张卡编写对应的运行时代码。
图放在哪里
三类资产带有 Behavior 字段,内嵌一张图:卡牌、状态、敌方单位。不存在独立的图资产;图序列化在它所属的卡牌、状态或敌人里面,你从 Workbench(工作台)中该资产的 inspector 打开它。
| 宿主 | 图表达什么 | 典型起始节点 |
|---|---|---|
| Card | 卡牌被打出、抽到、弃置、消耗或保留时发生什么 | On Card Played、On Card Drawn、On Turn Start |
| Status | 单位身上某个状态实例拥有的被动或反应式行为 | On Turn Start、On Damage Taken、Damage Taken Hook |
| Enemy | 敌方单位的意图选择和回合执行 | On Enemy Behavior Start、Sequence Pattern、Leaf Intent |
遭遇战和战斗规则没有 FlowGraph 字段。全局性的战斗行为(比如"回合结束时所有单位流血")应该实现为一个状态,由单位携带,而不是写在遭遇战上。
图如何运行
一张图从入口节点开始,入口是 On Card Played、Damage Taken Hook 这样的时机点。战斗进入对应时机后,入口触发并开始执行。一张图可以放多个入口,各自在自己的时机独立触发。从入口出发,控制线和数据线承担不同职责。
控制线决定顺序。执行一次走一个节点,永远沿着刚运行完的节点的控制线继续。多数节点只有一个 Out 端口;Flow 节点会在多个出口里选:Branch 走 True 或 False,Loop 每次迭代跑一遍 Body 链,最后从 Done 继续。
数据线携带值,并且按需读取。节点在运行时才索取输入:Deal Damage 执行时,才读取 Target 和 Amount 上连接的值,而且每次读取都会重新计算。Get 和 Operator 节点不参与控制路径,只有下游节点读取数据时才产出结果。因此,On Damage Taken 输出 Amount、Source 和 Target 供图读取,Unit Info 把一个单位拆成 HP、护甲、状态和意图数据,Deal Damage 输出 Dealt,也就是实际落地的伤害。
| 连线类型 | 回答什么问题 | 示例 |
|---|---|---|
| Control | 接下来运行什么? | On Card Played -> Deal Damage -> Play VFX |
| Data | 这个节点读取或产生什么值? | Unit Info.HP% -> Condition -> Branch |
有两个节点会暂停执行而不是立即完成:Wait 按时长或等一段动画结束再放行,Choice 等玩家做出选择。后续节点会在暂停结束后继续执行,原有顺序不变。
节点分组
Add Node 菜单把 140 多个内置节点组织成九个组,按创作意图命名,而不是按代码结构命名。
| 分组 | 当你想要……时使用 |
|---|---|
| Entry | 选择启动这张图的战斗时机 |
| Hook | 在 GCS 提交某个值之前拦截它 |
| Action | 改变战斗状态:伤害、HP、护甲、卡牌、状态、回合、变量、单位 |
| Get | 读取战斗状态:单位、卡牌、牌堆、能量、变量、事件参数 |
| Operator | 构建条件、数学运算、常量和集合操作 |
| Flow | 用分支、循环、switch、等待和玩家选择塑造执行流程 |
| FX | 请求可见可听的反馈:VFX、音效、浮动文字、镜头震动 |
| Intent | 构建敌人意图模式(仅限敌人图) |
| Event | 抛出 GCS 内部事件,或桥接到 GES |
菜单只显示当前宿主可用的节点,所以卡牌图里不会出现 Leaf Intent,敌人图里也不会出现 On Card Played。
Group 不属于这些菜单项。选中两个或多个节点并按 Ctrl+G,即可把它们打包成一个可折叠的 Group 节点。
入口与 Hook
入口在某个时机已经发生后响应;Hook 在某个值仍在被决定时参与计算。
当行为是一种响应时,用入口:
- 这张卡打出后,施加一个状态
- 某个单位死亡时,生成替代单位
- 每回合开始时,结算中毒伤害
当行为要改变 GCS 即将使用的值时,用 Hook:
- 有防御状态在身时,减少受到的伤害
- 让一张卡本回合费用变为 0
- 阻止一张卡被打出
Hook 图通常以 Write Hook(提交新值)或 Cancel Hook(整个取消)结束。如果你的 Hook 图只播放 VFX,这个行为通常应改为入口。完整的时机目录见入口与 Hook。
可以依赖的上下文
宿主会自动提供战斗上下文,通常不需要手动把"当前卡牌"或"正在行动的单位"传进图里。
| 需要什么 | 从这里开始 |
|---|---|
| 拥有这张图的卡牌 | This Card,或入口的 Card 输出 |
| 正在行动的单位 | Self Unit、Active Unit,或入口的 Source 输出 |
| 被选中的目标 | 卡牌自身的目标、Opponent Unit,或入口的 Target 输出 |
| 战斗数值 | Active Turn、Player Energy、Unit Info、Unit Status Stacks |
| 图中前面产生的值 | 直接数据线,或 Set Variable 加 Variable |
| 内部事件携带的数据 | On Internal Event 之后接 Event Arg |
第一张卡牌图
一张普通攻击卡的形状和上面的 Poison Arrow 一样:
- 从
On Card Played开始 - 在
Deal Damage上把TargetSource保持为Opponent,卡牌就会打在玩家选中的单位上 - 把
Amount设置为卡牌伤害 - 把
Deal Damage.Dealt连进Show Floating Text,弹出的数字才是过甲后的真实数字 Play VFX和Play SFX放在伤害节点之后
先结算状态,再播放表现。目标无效时,伤害节点不会产生结果;表现节点放在伤害节点之后,可以避免为未生效的动作播放反馈。
FlowGraph 的边界
FlowGraph 不是数据模型。费用、稀有度、tags、美术、目标规则和卡牌文本仍然留在卡牌资产上;图只描述战斗中发生的事。
它也不是配置具体表现资源的地方。FX 节点负责请求反馈,但实际的粒子 prefab、音频 clip 和 mixer 路由属于资产配置阶段。