跳到主要内容

FlowGraph 概览

GCS · FlowGraph Authoring

FlowGraph 是 GCS 的可视化行为层。每个卡牌效果、状态反应和敌人回合,都是一张内嵌在所属资产里的节点图。

第一次打开 FlowGraph 窗口之前先读这一页。它说明宿主、入口、Hook 和两种连线,是后续页面的基础。

FlowGraph 用来描述战斗行为:当战斗中某个时机发生时,当前内容应该执行哪些动作。创作者不需要为每张卡单独编写运行时脚本,只需要把行为组织成节点和连线,GCS 会在对应时机执行这张图。

Poison Arrow 卡牌行为图,在 FlowGraph 窗口中从 On Card Played 经 Deal Damage 连到 Change Status

上图是 demo 自带的 Poison Arrow。它对选中的敌人造成 3 点伤害,播放命中反馈(一个打包了 VFX、音效、浮动文字和镜头震动的 Group 节点),再叠加 2 层 Poison,最后以毒云特效收尾。这张图定义了卡牌的完整运行行为,不需要为这张卡编写对应的运行时代码。


图放在哪里

三类资产带有 Behavior 字段,内嵌一张图:卡牌、状态、敌方单位。不存在独立的图资产;图序列化在它所属的卡牌、状态或敌人里面,你从 Workbench(工作台)中该资产的 inspector 打开它。

宿主图表达什么典型起始节点
Card卡牌被打出、抽到、弃置、消耗或保留时发生什么On Card PlayedOn Card DrawnOn Turn Start
Status单位身上某个状态实例拥有的被动或反应式行为On Turn StartOn Damage TakenDamage Taken Hook
Enemy敌方单位的意图选择和回合执行On Enemy Behavior StartSequence PatternLeaf Intent
信息

遭遇战和战斗规则没有 FlowGraph 字段。全局性的战斗行为(比如"回合结束时所有单位流血")应该实现为一个状态,由单位携带,而不是写在遭遇战上。


图如何运行

一张图从入口节点开始,入口是 On Card PlayedDamage Taken Hook 这样的时机点。战斗进入对应时机后,入口触发并开始执行。一张图可以放多个入口,各自在自己的时机独立触发。从入口出发,控制线和数据线承担不同职责。

控制线决定顺序。执行一次走一个节点,永远沿着刚运行完的节点的控制线继续。多数节点只有一个 Out 端口;Flow 节点会在多个出口里选:BranchTrueFalseLoop 每次迭代跑一遍 Body 链,最后从 Done 继续。

数据线携带值,并且按需读取。节点在运行时才索取输入:Deal Damage 执行时,才读取 TargetAmount 上连接的值,而且每次读取都会重新计算。GetOperator 节点不参与控制路径,只有下游节点读取数据时才产出结果。因此,On Damage Taken 输出 AmountSourceTarget 供图读取,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 UnitActive Unit,或入口的 Source 输出
被选中的目标卡牌自身的目标、Opponent Unit,或入口的 Target 输出
战斗数值Active TurnPlayer EnergyUnit InfoUnit Status Stacks
图中前面产生的值直接数据线,或 Set VariableVariable
内部事件携带的数据On Internal Event 之后接 Event Arg

第一张卡牌图

一张普通攻击卡的形状和上面的 Poison Arrow 一样:

  1. On Card Played 开始
  2. Deal Damage 上把 TargetSource 保持为 Opponent,卡牌就会打在玩家选中的单位上
  3. Amount 设置为卡牌伤害
  4. Deal Damage.Dealt 连进 Show Floating Text,弹出的数字才是过甲后的真实数字
  5. Play VFXPlay SFX 放在伤害节点之后

先结算状态,再播放表现。目标无效时,伤害节点不会产生结果;表现节点放在伤害节点之后,可以避免为未生效的动作播放反馈。


FlowGraph 的边界

FlowGraph 不是数据模型。费用、稀有度、tags、美术、目标规则和卡牌文本仍然留在卡牌资产上;图只描述战斗中发生的事。

它也不是配置具体表现资源的地方。FX 节点负责请求反馈,但实际的粒子 prefab、音频 clip 和 mixer 路由属于资产配置阶段。