Flow 节点
查找并配置用于分支、重复、延迟、分组与安排执行顺序的节点
节点用法
Sequence
从上到下依次执行各个步骤;一个入口需要按固定顺序启动多段独立逻辑时使用,例如先造成伤害,再修改状态,最后播放表现效果
输入端口
In(控制):开始执行 Sequence
输出端口
Step0…StepN(控制):按编号顺序各执行一次,端口数量由Outputs决定
参数
Outputs(整数):2;顺序步骤数量,修改后会重建可见输出端口
步骤会按编号顺序执行,前一步的完整控制路径结束后才会启动下一步;路径遇到 Wait 或 Choice 时,整个效果波次会在该位置暂停,恢复后的分支完成后才继续后面的步骤;如果多个路径只能选一个,应使用 Branch 或 Switch
Outputs 设为 0 或负数时,没有任何 Step 路径会执行
Branch
根据布尔值在两条路径中选择一条,常见连接是 Condition.Result → Branch.Condition
输入端口
In(控制):触发本次判断Condition(布尔):true走True,false或未连接时走False
输出端口
True(控制):条件为 true 时执行False(控制):条件为 false 时执行
参数: 无
每次只会执行一个输出;如果 false 时什么都不做,可以不连接 False
Switch
用整数或字符串匹配多个 case,适合卡牌类型、意图名称、回合模式等超过两种结果的判断
输入端口
In(控制):开始匹配 caseOn(整数或字符串):与Case Values比较,类型跟随Kind
输出端口
Case 1…Case N(控制):每个值对应一个界面端口,顺序与Cases一致Default(控制):没有 case 匹配时执行,连接On后和 case 输出一起显示
参数
Kind(内部字段)(Int/String):推断前为Int;根据连接到On的数据类型自动设置,编辑器中没有单独的选择器Cases(Case Values)(整数或字符串列表):连接On前为空;UI 数量包含Default,其余每一行保存一个 case 值并创建一个可见 case 输出
字符串采用区分大小写的精确匹配;case 从上到下检查,重复值只会命中第一项;Int 模式下无法解析为整数的条目会被跳过
null 字符串输入按空字符串处理,因此可以命中空字符串 case
编辑器需要先连接 On 才能配置 case 或看到这些控制输出,可见的 Cases 数量包含最后的 Default,因此 Cases = 3 会创建两个可编辑值,以及 Case 1、Case 2 和 Default 三个界面输出
Gate
只有布尔条件为 true 时才让执行继续,适合不需要单独处理 false 分支的简洁前置条件
输入端口
In(控制):检查 GateAllow(布尔):true 时放行,false 时终止当前路径
输出端口
Out(控制):仅在Allow为 true 时执行
参数: 无
未连接的 Allow 为 false,执行会停在这里;两个结果都要执行不同逻辑时应使用 Branch
Loop
按固定次数重复同一段逻辑,需要按轮次缩放数值、选择元素或显示编号时可以使用从 0 开始的 Index
输入端口
In(控制):开始循环Count(整数):Body的执行次数,未连接时使用同名字段
输出端口
Body(控制):每轮执行一次Done(控制):所有轮次结束后执行,次数为零或负数时也会直接执行Index(整数):当前轮次,从0开始
参数
Count(整数):1;Count端口未连接时的备用值
每轮 Body 的完整路径执行完成后才进入下一轮,路径遇到 Wait 或 Choice 时会恢复本轮的 Index、节点结果与当前效果范围变量,完成恢复路径后再继续;所有轮次结束后,Done 与外层效果波次完成通知都只发出一次;已有集合并且需要拿到当前元素时,应使用 Foreach
Foreach
按集合原有顺序逐个处理单位、卡牌或状态,并提供当前元素和从 0 开始的索引
输入端口
In(控制):开始遍历Collection(单位、卡牌或状态集合):待遍历集合,类型跟随Kind
输出端口
Body(控制):每个元素执行一次Done(控制):最后一个元素结束后执行,集合为空或 null 时直接执行Element(单位、卡牌或状态引用):当前元素,类型跟随KindIndex(整数):当前元素索引,从0开始
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据连接到Collection的集合自动设置,不能直接编辑
应把 Element 连接给 Body 内的 Action;如果连接整个集合,同一个集合动作会在每轮重复执行
集合中的 null 元素也会占用一轮,此时 Body 仍会执行,Element 为 null
Foreach 开始时会创建集合的浅快照,Body 增加、移除或移动原集合成员不会改变本次遍历已经确定的元素与顺序,但快照中的单位、卡牌或状态仍是同一个实时对象,对对象字段的修改会立即可见
每个元素的完整 Body 路径结束后才会处理下一个元素,路径遇到 Wait 或 Choice 时会恢复当前 Element、Index、节点结果与当前效果范围变量,完成恢复路径后再继续遍历;捕获的集合处理完后,Done 与外层效果波次完成通知都只发出一次
While
在布尔条件保持 true 时反复执行 Body,仅适用于 Body 会改变条件所读取数据的场景
输入端口
In(控制):开始检查条件Condition(布尔):每轮开始前重新读取
输出端口
Body(控制):条件为 true 时执行Done(控制):条件变为 false 后执行
参数: 无
While 必须最终变为 falseCondition 始终为 true 时,运行时会持续迭代并在超过流图遍历预算后中止执行与记录错误;Body 未连接时不会改变条件,因此不能让 true 条件自行结束;Wait 或 Choice 可以暂停当前轮次,恢复后才会重新检查条件,但它们不会替代明确的退出条件;跨回合循环应使用 Delayed Trigger
Body 进入 Wait 或 Choice 时,运行时会恢复本轮的节点结果与当前效果范围变量,完成恢复路径后再重新计算 Condition;条件变为 false 时,Done 与外层效果波次完成通知都只发出一次
Wait
暂停当前效果波次后再继续,短暂的表现节奏使用 Seconds,需要由其他表现代码明确释放时使用 Animation
输入端口
In(控制):开始等待Seconds(浮点数):Seconds模式显示,连接值会覆盖 Inspector 时长AnimationId(字符串):Animation模式显示,连接值会覆盖 Inspector ID
输出端口
Out(控制):等待结束后执行,无法建立等待任务时立即执行
参数
Mode(Seconds/Animation):Seconds;决定显示的输入端口和等待方式Seconds(浮点数):0.5;Seconds模式的等待时长Animation Id(字符串):空;Animation模式等待的 Gate reason
Seconds 小于等于 0 时立即继续;Animation 不会自动监听 Animator 的 clip 或 trigger,表现层必须在节点执行前已经 Acquire 同名的 AnimationGate reason;reason 没有被持有时会立即继续,被持有时会等到释放,或在五秒安全超时后继续,空 Animation Id 会使用 Flow Wait
建立实际等待时,运行时会保存当前上下文槽位、流图结果与运行变量,恢复后从这份快照继续 Out,其中引用的单位、卡牌和状态仍是实时对象;等待期间,当前入口的其他控制分支、卡牌与状态生命周期以及战斗阶段推进都会保持暂停,玩家不能打出另一张牌或结束回合;Out 恢复后的路径完成后,运行时才会继续同一效果波次
Delayed Trigger
把一段逻辑登记到之后的战斗阶段执行,同时让当前图从 Done 继续,适合倒计时效果,不适合短暂的画面停顿
输入端口
In(控制):尝试登记延迟逻辑
输出端口
Body(控制):保存为未来执行入口,本次不会立即运行Done(控制):登记后立即继续
参数
Delay Turns(整数):1;等待多少次所选阶段边界后触发,零或负数不登记BodyFire At(Tick Phase)(PlayerTurnEnd/PlayerTurnStart/EnemyPhaseEnd):PlayerTurnStart;用于倒计时和触发的阶段边界,在该边界处理期间新登记的项从下一次边界开始计数Cancel If Source Dies(Cancel On Source Death)(布尔):关闭;来源登记时已经死亡会拒绝排队,触发前死亡会取消待执行逻辑
只有 Body 已连接且 Delay Turns 大于零时才会登记延迟逻辑;设置为零或负数时仍然只走 Done,不会改成立即执行 Body
登记时会复制当前持有者、Source、Target、Attacker、卡牌、状态、事件参数、流图结果与运行变量,触发时继续使用这份上下文快照;快照固定这些槽位与集合成员,但其中引用的单位、卡牌和状态仍是实时对象,触发前发生的 HP、层数或实例状态变化仍然可见;OnDelayedTriggerFired 只有在未来 Body 的完整路径及其中嵌套的 Wait 或 Choice 恢复路径都完成后才发布;战斗结束或被新战斗替换时,旧战斗的延迟项与回调也不会继续执行
每个排队的 PendingDelayedTrigger 都会公开当前战斗内的 TriggerId,并通过 CardDefinitionSnapshot 保存登记时关联的卡牌定义;排队、触发与取消事件会沿用该值作为 TriggerId,同时携带 SourceUnitId、TargetUnitId、TickPhase 与 Card,多个倒计时因此可以独立追踪

Choice
把单位、卡牌或状态集合交给运行时选择界面,再根据玩家确认或跳过进入对应路径,用于需要玩家作出选择的效果
输入端口
In(控制):打开选择界面Options(单位、卡牌或状态集合):候选集合,null 元素会被忽略,类型跟随KindCount(整数):最大选择数量,连接值会覆盖节点字段
输出端口
OnChosen(控制):玩家确认有效选择后执行Skipped(控制):玩家跳过,或当前没有 presenter / 候选项时执行Chosen(单位、卡牌或状态集合):玩家确认的结果,类型跟随Kind
参数
Kind(内部字段)(Unit/Card/Status):推断前为Card;根据连接到Options的集合自动设置,不能直接编辑Prompt(字符串):空;选择界面显示的提示Count(整数):1;端口未连接时使用的最多选择数量Mode(Exactly/UpTo):Exactly;必须选满有效数量,或最多选择该数量Allow Skip(布尔):关闭;是否允许不选任何内容直接确认
实际最大数量会先读取已连接的 Count,再限制为不超过候选数,有候选时也不会低于一个;UpTo 在关闭跳过时仍至少要选一个;如果 Presenter 不存在或候选集合为空,即使关闭 Allow Skip 也会走 Skipped
选择界面打开后,整个效果波次、卡牌与状态生命周期以及战斗阶段推进都会暂停,玩家也不能打出另一张牌或结束回合;提交选择或跳过并完成对应分支后,排队中的同级控制分支与状态响应会按原有因果顺序恢复,运行时再继续同一波次中的后续路径
