流图基础
把一张行为图读成一句玩法规则:当这个时机到达时,使用这些目标与数值执行这些动作
下图中的Poison Arrow 是Demo 中一张卡牌的流图,从左向右接入的流图节点依次为:On Card Played 打开路径 -> Deal Damage 造成伤害 -> 表现节点读取实际结果 -> Change Status 再施加 Poison状态

Behavior 内嵌在宿主体内
FlowGraph 直接内嵌在玩家能够感知其结果的内容中,不需要另外创建或指定图资产:
| 所有者 | Behavior 表达的规则 | 常见起点 |
|---|---|---|
| Card | 卡牌打出时或进入其他生命周期时机后发生什么 | On Card Played、其他 Card Entry 或 Hook |
| Status | 状态贡献的反应、持续规则与待提交数值修改 | Battle 或 Status Entry,或 Hook |
| Enemy | 敌人怎样选择 Intent,以及该 Intent 实际执行什么 | On Enemy Behavior Start 与 Intent Pattern |
逻辑触发时机
每条可执行路径都从它需要表达的时机类型开始:
| 起点 | 使用场景 | 示例 |
|---|---|---|
| Entry | 在文档化的战斗或内容生命周期到达后做出反应 | 卡牌打出后施加 Poison,或在回合开始触发状态 |
| Hook | 在 GCS 提交数值前改写或取消它 | 增加输出伤害、改写抽牌数或拒绝出牌 |
| Intent Pattern | 选择并预告敌人将要执行的行动 | 从 Sequence 或 Weighted Pattern 中选出一个 Leaf Intent |
时机属于机制本身,“回合结束时”的规则必须连接匹配的回合结束 Entry,不能用时间相近的其他 Entry 代替
Entry 节点与 Hook 节点记录精确可用范围与时机,战斗阶段与执行顺序则记录它们在完整战斗生命周期中的位置
控制流与数据流
控制连线回答“下一步执行什么”,而数据连线回答“该步骤使用哪个目标或数值”:
| 连线 | 职责 | 常见形式 |
|---|---|---|
| 控制流 | 排列 Action、Branch、Loop、Wait、Choice 与 Intent 路径的执行顺序 | Out / In、True / False、Body / Done、命名 Case |
| 数据流 | 提供单位、卡牌、集合、数值、布尔、文本与实际结果 | Source 或 Result Output 连接到一个 Consumer Input |
动态参数端口
部分节点字段支持动态参数扩展,可直接切换为 Input Port来获取动态参数值:
连接 Input -> 拉取运行时数值
未连接 Input -> 使用字段中保存的数值
固定设计值适合用于配置常量数值,例如 Amount = 6,只有当需要计算当前护甲、已损失 HP 或 Hook 输入值等动态数值时才展开动态端口
FlowGraph Editor说明了 Socket 开关、端口布局与连线操作
延迟求值机制
数据流不会提前沿着整张图进行广播或流动。只有当某个 Action 节点正式开始执行时,它才会向其相连的 Producer 拉取当前所需的数据。
这项规则直接形成四个创作结果:
- 时序敏感度:Get 节点读取当前战斗状态,伤害后再读取 HP 会得到已减少的数值
- 实时计算:Operator 与 Selector 使用 Consumer 拉取时的实时输入完成计算
- 单次求值稳定性:Source Result 在同一次求值周期中保持稳定,后续 Action 或 Loop 迭代则可以生成新值
- 快照保存:多个后续 Action 需要共享同一快照时,把该值保存到 Graph 或 Battle Variable
运行时上下文的作用
相同的逻辑节点之所以能在 Card、Status 与 Enemy 中无缝复用,是因为运行时上下文会在执行时,动态为节点注入“当前是谁在释放”、“当前目标是谁”以及“实时的战斗数据”
| 运行时数据需求 | 数值来源 |
|---|---|
| 当前卡牌 | This Card,或 Entry Output |
| 当前行动者/持有者 | Self Unit、Active Unit 或 Entry Output |
| 目标单位(玩家选中/逻辑算出的目标) | Card Selection、Source Dropdown 或已连接 Selector |
| 实时属性(HP、护甲、能量、回合数、牌堆、状态层数) | 读取实时战斗的 Get 节点 |
| 属性或状态变更 | 通过 Context Controller 执行的 Action 节点 |
| 事件/Hook 传入参数 | 匹配的 Hook 或 Event Entry Output |
上下文让逻辑中的 Self 拥有了动态身份。如果在卡牌里,Self 就是释放卡牌的玩家;如果在状态(Status)里,它就是带有该 Buff 的单位;如果在敌人行为里,它就是当前的敌方实体,具体的Source 规则与已连接 Target Port 的优先级,详见目标选择
数值传递机制与数据域划分
根据数值需要被“共享”和“保留”的范围,选择最合适的数值传递方式:
| 数值表面 | 使用时机 |
|---|---|
| 直接连线 | 只有一个下游节点需要当前数值 |
| 实际结算结果 | 后续逻辑或视觉表现需要依赖最终实际生效的数值(即经过了护甲减免、Hook拦截、属性上限过滤以及目标校验后的真实结果) |
| 图变量 | 当前 Graph Run 中的多条路径需要共享一个快照 |
| 战斗全局变量 | 数值需要跨越 Entry、Card 或 Turn 保留 |
| 内部事件 | 不同内容所有者需要在没有直接资产引用时交换数据 |
- 玩家看到的伤害、治疗等界面反馈,必须优先读取结算后的实际输出(如
Dealt、Changed、Drawn、Added等实际 Output 引脚) - 严禁直接去拉取原始的输入节点!因为在实际结算中,护甲减免、状态Hook、属性上限限制以及目标合法性校验,很可能已经让这个数值发生了改变,甚至导致该行为根本没有生效
- 直接读输入会导致视觉表现(如飘字)与实际血条变化对不上
“配置”与“逻辑”的分离规范
为了保证逻辑节点的可复用性,严格执行数据配置与连线逻辑分离的原则。请遵循以下划分指南:
| 保留在内容资产 | 放入 FlowGraph |
|---|---|
| 名称、描述、费用、类型、稀有度、标签、美术、Target、叠层规则、单位属性与 Encounter Rules | 伤害、治疗、护甲、卡牌移动、状态反应、Hook、敌人行动、Choice、Wait、Event 与表现请求 |
- 表现与资产解耦:FlowGraph 中的表现节点只负责发出播放请求,其具体引用的特效粒子、音频、预制体、材质和混音器依然属于静态的表现资产,不应硬编码在逻辑中
- 目标判定逻辑:卡牌资产上的
Target字段决定了玩家拉线释放时的交互方式,而流图中的 Graph Source 则决定了执行具体 Action(如扣血)时,实际将哪些单位解析为目标
在 FlowGraph Editor中打开并连接 Behavior,用节点参考查找精确端口与参数,已有验证组合则直接从卡牌配方、状态配方或敌人配方进入