跳到主要内容

FlowGraph 编辑器工作流

GCS · FlowGraph Authoring

FlowGraph 窗口的日常循环:从所属资产打开图,先连控制线再连数据线,并通过 Issues 徽标尽早发现结构问题。

面向在 Workbench 中已建好卡牌、状态或敌人,接下来要编辑其行为的所有人。

FlowGraph 窗口用于编辑具体行为。先在 Workbench(工作台)里创建卡牌、状态或敌人;图的编辑在那之后,从该资产的 inspector 进入。

FlowGraph 窗口中的 Rapid Fire 卡牌图:一个 Loop 节点驱动 Deal Damage 对随机敌人打出四次

这是 demo 的 Rapid Fire。On Card Played 入口启动一个 Count = 4Loop;每一轮运行 Amount = 3Deal Damage,目标每次都从 All Enemies 传入 Random Elements 后重新选取。卡面写的是 "Deal 3 damage to a random enemy 4 times",图结构与这句效果文本一致。


从 Workbench 打开图

在 Workbench 中选中卡牌、状态或敌人,点击其 inspector 里的 Edit FlowGraph 按钮。窗口会打开该资产内嵌的 Behavior 图,页眉显示 <Asset Name> / FlowGraph,你随时都知道正在编辑谁的行为。

卡牌 inspector 的 Behavior 段:用于进入图的 Edit FlowGraph 按钮和 OnCardPlayed 入口标签

从所属资产打开很重要,因为宿主决定 Add Node 菜单提供什么。卡牌图和状态图都能用 Deal Damage,但只有卡牌图有 On Card PlayedThis Card,只有敌人图有 Intent 模式节点。不存在"凭空"打开一张图的方式;每张图都属于某个资产。

工具栏覆盖了图的日常操作:选择与平移工具、全图取景或选区取景、全选、网格开关、节点的创建/删除/复制/粘贴、Group 工具、缩放控制,以及撤销/重做。编辑完按 Esc 关窗。

FlowGraph 窗口打开 demo 卡 Strike 的图,顶部是完整工具栏,缩放显示 100%


添加节点

打开 Add Node 菜单有三条路:

操作位置
双击画布任意空白处;节点落在点击的位置
右键,选 Create Node画布空白处
工具栏的 Create Node 按钮任何时候

菜单是一个可搜索的下拉列表,按固定顺序分组:Entry、Hook、Flow、Intent、Action、Get、Operator、FX、Event。输入关键词可以缩小结果范围,例如 dam 会列出 Deal Damage 和几个伤害 Hook。

列表按图的宿主过滤。卡牌图能看到卡牌入口和 This Card;只有敌人图列出 Intent 节点;Hook 出现在卡牌图和状态图里。想用的节点不在列表里,通常说明当前宿主不支持该节点。完整的可用性对照见入口与 Hook


构建一张图

  1. 为你关心的时机添加一个入口节点
  2. 从 Add Node 菜单添加行为所需的 Action、Flow 和 Get 节点
  3. 从左到右连接控制端口,直到图有完整的执行路径
  4. 只在节点必须读取另一个节点的值时,才连接数据端口
  5. 填写没有数据线驱动的其余字段
  6. 继续之前检查 Issues 徽标

一张完成的图通常应该能读成一句话:这个时机发生时,选中这些目标,施加这个变化,然后展示这个反馈。如果无法概括出这条主路径,通常说明控制路径有缺口,或者入口选错了。


阅读节点卡片

区域含义
Header节点在 Add Node 菜单中的名字
Fields可编辑设置:数值、目标来源、牌堆、时长、clip、条件运算符
左侧端口输入。控制输入启动节点;数据输入从其他节点读值
右侧端口输出。控制输出继续执行;数据输出供后续节点使用
插槽按钮值字段行末的 ○ / ◉ 开关,决定该字段是内联值还是输入端口

大多数值字段默认不显示端口。能被连线驱动的字段,行末带一个小插槽按钮:○ 表示字段当前是你直接填写的内联值;点一下,字段就变成节点左侧的一个输入端口,按钮变成 ◉,这一行改为只读地显示当前驱动它的值。再点 ◉ 切回去:端口消失,接进来的线也一并移除。从不暴露的字段让节点保持紧凑。

节点的每个值字段行末都有插槽按钮:Deal Damage 的 Target 和 Amount 保持内联值、显示空心 ○ 插槽,而 Play Effect 的 Amount 已暴露为实心 ◉ 输入端口、由连线驱动

暴露的端口接上线后,运行时以连接值为准,字段退化为日后删线时的 fallback。固定值能够表达清楚时,不需要暴露端口。


先连控制线

控制线描述顺序。先让图形成正确的执行路径,再考虑数据连线。推荐顺序:

  1. 入口
  2. 目标选择
  3. 改变状态的 Action
  4. 需要时加分支或循环
  5. 表现反馈
  6. 事件或收尾

除非反馈本身就是起手动作,否则表现通常放在状态变化之后。Play VFX 如果放在可能失败的 Deal Damage 前面(没有目标、数值为零),画面会显示命中反馈,但战斗状态没有变化。

FlowGraph 窗口中的 Poison Arrow 卡牌图:On Card Played 连进 Deal Damage,再到 Change Status,表现节点分组放在状态变化之后

demo 的 Poison Arrow 就是这个顺序:On Card Played、造成 3 点伤害的 Deal Damage、施加 2 层 Poison 的 Change Status,镜头震动、飘字和弹道特效都分组排在它们要宣告的状态变化之后。

连线的基本规则:

规则拖线时意味着什么
从任意端口拖出,落到另一侧的端口上输出连输入,拖动预览跟着光标走
一个控制输出只接一个后继节点需要多条去路的节点自带命名输出(True/FalseBody/DoneStep0……)
一个控制输入可以接多根来线多条路径可以汇聚到同一个动作
数据输出随便分叉;数据输入只收一根线一个 Unit Info 到处复用;每个消费端口只认一个来源
类型不合的数据线会被标记,不会直接丢弃线渲染成断裂样式,中点有警告图标;悬停能看到原因,比如文本输出接进了数字输入,Issues 徽标也会计数
在已连接的输入端口上按住拖动,把线重新拖出可以重新选择连接目标

数据线用于动态值

值是动态的时候,才需要使用数据线:

需要什么从哪里连
当前 HP 或护甲Unit Info
实际落地的伤害Deal DamageDealt 输出
一张卡的费用或类型Card Info
当前能量Player Energy
Hook 正在裁决的值Hook 入口的 Value 输出
选择器找到了几个Count

固定值优先用字段。Amount = 8Deal Damage 比接一个 ConstantAmount 更清楚;只有当数值需要计算或复用时才连线。


重排、重命名、参考抽屉

三个小工具可以改善日常编辑效率:

工具怎么用
重排端口上下拖动端口的标签,其余端口自动让位,新顺序随节点保存。最常连线的端口可以放在更容易操作的位置
重命名端口双击端口标签直接输入。自定义名只是这个节点的显示标签,连线和行为都不变。InOut 不可改名
参考抽屉Tab(或右侧的抽屉把手)。选中任意节点即可查看它的用途、运行时机、端口和参数,不需要离开窗口

快捷键

快捷键动作
双击画布在光标处打开 Add Node 菜单
Ctrl+A全选节点
Ctrl+F取景到选区;没有选区时取景全图
Space取景全部节点
Ctrl+C / Ctrl+V复制 / 粘贴选中的节点
Ctrl+G把选中的节点打成 Group
Ctrl+→ / Ctrl+←进入选中的 Group / 退回上一层
Delete删除选区;选中的是 Group 时解包它并保留内部节点
Shift+Delete连同内部节点一起删除 Group
Ctrl+Z / Ctrl+Y撤销 / 重做
Tab开关参考抽屉
Esc先关帮助浮层,再关窗口

检查 Issues 徽标

图有问题时,窗口会显示 ⚠ N Issues 徽标。点击查看列表,每条问题都能跳转到对应节点。校验器能抓到的问题包括:

问题含义
Node is not allowed for this FlowGraph host节点放在了不支持它的宿主图里,比如 Intent 节点出现在敌人图之外
Internal event entry requires an event nameOn Internal Event 入口的 EventName 为空
GES event entry requires a GES eventOn GES Event 入口没有指定事件资产
Type mismatch数据线两端的值类型对不上,比如文本接进了数字
Connection references a missing node or port连线指向了已被删除或改名的节点或端口

同一套检查也在 Workbench 的校验流程里运行,所以存在问题的行为图会同时显示在资产本身上。

提示

图在运行时表现异常但校验没有报错时,可以先缩小到验证时机的最小路径:入口直连 Show Floating Text。确认浮动文字出现在正确时机后,再逐段接回实际行为。


让图保持可读

布局也是文档。它应该让下一位打开这张图的人快速理解主路径、数据来源和反馈位置。

习惯为什么有用
主控制路径保持水平从入口到结果更容易扫读
数据来源放在读取它的节点上方连线短,也很少交叉
表现放在状态变化之后反馈永远对应真实结果
只在有线驱动时才把字段暴露成端口节点保持短小,内联值随时可改
重复逻辑包进 Group 节点大图保持可导航,Group 还能复用
变量按玩法含义命名BonusDamageValue1 更容易维护

常见编辑错误

错误更好的做法
一张图里塞多个入口且没有视觉分隔给每个入口留出清楚分隔的区域,或者拆分行为
卡牌只打敌人,目标却用 AllUnitsOpponentAllEnemies,或按队伍 Filter
只读一次的值也用 Set Variable把输出直接连给使用方
条件还没搭好就先放 Branch先建 Condition,再连进 Branch.Condition
Hook 图里没有 Write Hook补上 Write Hook;如果本来就不改值,换成入口