Operator 节点
处理数值和集合,但不修改战斗状态
Operator 节点接收 Get 节点或其他节点输出的数据,完成计算或缩小集合后,再把结果连接到需要该数据的节点Operator 节点接收 Get 节点或其他节点输出的数据,完成计算或缩小集合后,再把结果连接到需要该数据的节点
节点用法
Math Binary
对两个数执行四则运算、取较小值、取较大值或幂运算,常用于先算出伤害、费用或 Hook 结果,再把数值交给后续节点
输入端口
A(整数或浮点数):左操作数,未连接时使用字段值B(整数或浮点数):右操作数,未连接时使用字段值
输出端口
Result(整数或浮点数):运算结果,类型跟随Kind
参数
Number Type(Kind)(Int/Float):Int;决定输入与结果类型A(数值):0;A未连接时的备用值B(数值):0;B未连接时的备用值Operation(Op)(Add、Sub、Mul、Div、Mod、Min、Max、Pow):Add;对A和B执行的运算
除数或取模数为零时返回 0;整数除法会舍去余数,整数 Pow 会把浮点幂结果四舍五入为整数
Math Unary
只处理一个数值,适合取负、绝对值、符号、平方根或取整
输入端口
A(整数或浮点数):待处理数值,未连接时使用字段值
输出端口
Result(整数或浮点数):Int模式始终输出整数,Float模式的Sign、Floor、Ceil、Round输出整数,其余输出浮点数
参数
Number Type(Kind)(Int/Float):Int;选择数值模式A(数值):0;输入端口未连接时的备用值Operation(Op)(Neg、Abs、Sign、Sqrt、Floor、Ceil、Round):Neg;对A执行的处理
Sqrt 会先把负数限制为零;Int 模式中的 Floor、Ceil 和 Round 不会再改变整数,Float 模式中的 Sign、Floor、Ceil 和 Round 会显示整数结果端口
Clamp
把数值限制在包含上下界的范围内,常用于限制费用、百分比、倍率或 Hook 修改结果
输入端口
Value(整数或浮点数):待限制数值Min(整数或浮点数):包含在范围内的下限Max(整数或浮点数):包含在范围内的上限
输出端口
Result(整数或浮点数):限制后的结果,类型跟随Kind
参数
Number Type(Kind)(Int/Float):Int;决定所有端口类型Value(数值):0;Value未连接时的备用值Min(数值):0;Min未连接时的备用值Max(数值):1;Max未连接时的备用值
范围由其他效果动态决定时再连接上下限,否则直接使用 Inspector 值即可
Min 应小于等于 Max,节点会直接把数值交给 Mathf.Clamp,不会交换或纠正反向边界
Condition
比较两个值并返回布尔结果,可以把 Result 连接到 Branch、Gate、Select 或 Hook 规则
输入端口
A(任意):左侧比较值B(任意):右侧比较值
输出端口
Result(布尔):当前比较规则的结果
参数
Operation(Op)(>(Greater)、≥(GreaterEqual)、<(Less)、≤(LessEqual)、=(Equal)、≠(NotEqual)、∈(In)):=;编辑器中显示的比较规则
数值比较支持整数、浮点数、布尔值(false 为 0、true 为 1)和数值文本,无法解析的文本按 0 参与比较。数字相等使用 Mathf.Approximately 近似比较,字符串按区分大小写的精确文本比较;任一侧为 null 时,两侧都会按文本比较,因此 null 与空字符串相等,两个未连接输入执行 Equal 也会得到 true,其他类型使用值相等判断。In 会把两侧转为字符串列表,只要存在一个完全相同的项目就返回 true,逗号或分号分隔的文本会拆成多项,两个空列表不会命中
Logic
组合或取反布尔值,例如表达“目标存活并且 HP 低于 50%”这样的复合条件
输入端口
A(布尔):第一个条件,未连接时使用字段值B(布尔):And、Or、Xor时显示,Not时隐藏
输出端口
Result(布尔):组合或取反后的结果
参数
A(布尔):关闭;A未连接时的备用值B(布尔):关闭;使用第二个条件时的备用值Operation(Op)(And、Or、Xor、Not):And;布尔运算,Not只读取A
Xor 仅在两个输入恰好一个为 true 时返回 true
Ref Equal
判断两个端口是否指向同一个运行时对象,适合确认“当前集合元素是不是触发这个 Hook 的那张卡”
输入端口
A(任意引用):第一个对象引用B(任意引用):第二个对象引用
输出端口
Result(布尔):引用身份比较结果
参数
Operation(Op)(Equal/NotEqual):Equal;返回是否为同一引用,或返回其反值
它不会比较名称、ID、字段值、标签或集合内容,这些值的比较应使用 Condition
两个输入都未连接时均为 null,因此 Equal 返回 true,NotEqual 返回 false
Select
根据条件返回两个候选值中的一个,适合只改变数据、两种结果仍然进入同一个后续节点的情况
输入端口
Condition(布尔):true 时选择IfTrue,否则选择IfFalseIfTrue(所选类型):条件为 true 时返回IfFalse(所选类型):条件为 false 时返回
输出端口
Result(所选类型):被选中的输入值
参数
Value Type(Kind)(Int、Float、Bool、String、Unit、Card、Status):Int;决定候选与结果端口类型
两种结果需要执行不同 Action 或表现时,应使用 Branch
Condition 未连接时为 false,被选中的候选输入未连接时,Result 为 null
Constant
提供固定标量或由数据库字段下拉选择的文本,适合在图里复用同一个字面值,或者给它一个清楚的节点标题
输入端口: 无
输出端口
Value(整数、浮点数、布尔、字符串或字符串列表):类型跟随Kind,数据库 Tags/Keywords 字段通过Any端口输出字符串列表,不输出资产引用
参数
Value Type(Kind)(Int、Float、Bool、String、Card、Status、Player、Enemy):Int;决定值编辑器和输出契约Int Value(整数):0;仅用于IntFloat Value(浮点数):0;仅用于FloatBool Value(布尔):关闭;仅用于BoolString Value(字符串):空;用于String和数据库单值字段Field(数据库字段):空;Card、Status、Player或Enemy模式下选择 Type、Rarity、Tier、Tags、Keywords 等字段String Values(字符串列表):空;所选字段为 Tags 或 Keywords 这类多值字段时使用
Card、Status、Player 和 Enemy 模式虽然提供数据库下拉项,运行时结果仍是选中的字符串或字符串列表,并不是 CardRef、StatusRef 或单位引用;Action 需要真实对象时应使用 Get 节点
Convert
把标量转换为整数、浮点数、布尔或字符串,只在确实存在类型边界时使用,尽量保持原生端口类型会让行为图更容易阅读
输入端口
A(任意标量):待转换的值
输出端口
Result(整数、浮点数、布尔或字符串):转换结果,类型跟随To
参数
To Type(To)(Int、Float、Bool、String):Float;目标类型
浮点数转整数会四舍五入;无效数值文本会变成 0,布尔会变成 0 或 1。字符串非空时为 true,数字非零时为 true,不支持的对象类型会得到目标类型的空值
Random
生成随机整数、浮点数或布尔值,随机布尔结果可以直接交给 Branch
输入端口
Min(整数或浮点数):Int、Float模式显示,范围下限Max(整数或浮点数):Int、Float模式显示,范围上限Probability(浮点数):Bool模式显示,返回 true 的概率
输出端口
Result(整数、浮点数或布尔):随机结果,类型跟随Kind
参数
Roll Type(Kind)(Int、Float、Bool):Int;选择范围模式或概率模式Min(数值):0;Int、Float模式下限备用值Max(数值):1;Int、Float模式上限备用值Probability(浮点数):0.5;布尔概率,通常使用0到1
数值范围的两端都可能取到。Bool 模式中,小于等于 0 必定为 false,大于 1 必定为 true;需要从集合中随机选择对象时应使用 Random Elements
Count
返回单位、卡牌或状态集合中的元素数量,适合检查手牌数量、计算倍率或判断还剩多少目标
输入端口
Collection(单位、卡牌或状态集合):待计数集合,类型跟随Kind
输出端口
Result(整数):元素数量,null 集合返回0
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据连接的集合类型自动设置,不显示为可编辑参数
节点读取集合保存的长度,因此非空集合中的 null 元素也会计入数量
Is Empty
判断集合是否为空,如果只关心有没有元素,它比先用 Count 再和零比较更直观
输入端口
Collection(单位、卡牌或状态集合):待检查集合,类型跟随Kind
输出端口
Result(布尔):集合为 null 或元素数为零时返回 true
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据连接的集合类型自动设置,不显示为可编辑参数
只包含一个 null 元素的集合也不算空,本节点只检查集合引用和元素数量
Contains
检查集合中是否包含同一个运行时对象,适合在选择或筛选后确认成员关系
输入端口
Collection(单位、卡牌或状态集合):待搜索集合Value(单位、卡牌或状态引用):待查找对象,类型跟随Kind
输出端口
Result(布尔):集合中出现同一个对象引用时返回 true
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据Collection自动设置,同时改变Value的引用类型
这里比较的是引用身份,不是资产名称、GUID、标签或字段值;集合或 Value 为 null 时返回 false
Filter
从单位、卡牌或状态集合中保留符合条件的元素,通常放在宽泛的 Get 节点与目标 Action、Sort 或 Pick Element 之间
输入端口
Collection(单位、卡牌或状态集合):来源集合,类型跟随Kind
输出端口
Result(单位、卡牌或状态集合):按来源顺序保留匹配且非 null 的元素
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据Collection自动设置,同时改变可见行内条件和结果类型Filter By(By Unit)(多选:Team、Tags、Tier、HasStatus、HPBelow、HPAbove、Alive):Alive;连接 Unit 集合后显示的单位筛选条件Filter By(By Card)(多选:Type、Rarity、Keywords、Tags、CostBelow、CostAbove):Type;连接 Card 集合后显示的卡牌筛选条件Filter By(By Status)(多选:Type、Tags):Type;连接 Status 集合后显示的状态筛选条件Status(Status Id)(状态标识):None;HasStatus条件使用Team(Player/Enemy):None;单位Team条件使用Tier(敌人层级):None;单位Tier条件使用,玩家单位不会匹配Keyword(卡牌关键词):None;卡牌Keywords条件使用Tags(字符串列表):空;单位、卡牌或状态的Tags条件使用Type(卡牌类型):None;卡牌Type条件使用Rarity(卡牌稀有度):None;卡牌Rarity条件使用Status Type(Buff/Debuff):Buff;状态Type条件使用Cost(整数):0;卡牌费用条件的阈值HP%(Percent)(浮点数):50;单位 HP 百分比条件的阈值
所有已选条件按 AND 组合;Tags 列表内部只要有一个完全相同的标签就算匹配。HPBelow 和 HPAbove 是严格小于和大于,CostBelow 表示有效费用 ≤ 阈值,CostAbove 表示有效费用 ≥ 阈值。条件列表为空时保留所有有效元素,但某个已启用条件依赖的文本字段为空时,该条件会失败
当前只有 Collection 是数据插口,Status Id、Team、Percent、Cost 和其他筛选条件都只能直接在节点上编辑,不能从其他节点连线输入
Sort
返回重新排序后的集合副本,可以在 Pick Element 或 Take 之前找出最低 HP 单位、最高费用卡牌或按层数排列的状态
输入端口
Collection(单位、卡牌或状态集合):待复制并排序的集合,类型跟随Kind
输出端口
Result(单位、卡牌或状态集合):排序后的新集合,不修改原集合
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据Collection自动设置,同时改变可见排序字段和结果类型Sort By(By Unit)(HP/Armor):HP;单位排序依据Sort By(By Card)(Cost):Cost;按有效能量费用排序Sort By(By Status)(Stacks):Stacks;按当前图拥有者身上的状态层数排序Order(Ascending/Descending):Ascending;升序或降序
状态集合的层数来自当前 host,节点没有额外的目标单位输入
null 元素会保留在结果中,并按排序值 0 参与比较
Pick Element
从集合中取出一个元素,配合 Sort 可以选最低或最高值,已有索引时可以使用 AtIndex
输入端口
Collection(单位、卡牌或状态集合):待读取集合Index(整数):仅AtIndex显示,从0开始,未连接时使用字段值
输出端口
Element(单位、卡牌或状态引用):选中的元素,集合为空、索引越界或被选槽位本身为 null 时均返回 null
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据Collection自动设置,同时改变元素结果类型Pick By(By)(First/Last/AtIndex):First;选择方式Index(整数):0;AtIndex模式下的备用索引
Take
从集合开头或末尾复制最多指定数量的元素,并保留这些元素在原集合中的顺序
输入端口
Collection(单位、卡牌或状态集合):来源集合Count(整数):最多保留几个,未连接时使用字段值
输出端口
Result(单位、卡牌或状态集合):由所选范围组成的新集合
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据Collection自动设置,同时改变结果集合类型Count(整数):1;待选数量的备用值From(Top/Bottom):Top;从集合开头或末尾读取
数量超过集合长度时返回全部元素,数量为零或负数时返回空集合
选中范围内已有的 null 元素会原样保留
Exclude
从一个集合中移除另一个集合包含的全部对象,适合“除主目标以外的所有敌人”这类目标范围
输入端口
Collection(单位、卡牌或状态集合):来源元素Exclude(同类集合):要移除的元素
输出端口
Result(单位、卡牌或状态集合):移除后保持来源顺序的新集合
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据Collection自动设置,同时应用到两个集合输入和结果
成员判断使用运行时对象身份,null 元素不会进入结果,来源集合为 null 时返回空集合,排除集合为 null 时不移除任何内容
Merge Collections
把两个集合首尾拼接,适合把两个来源的目标交给同一个后续 Action
输入端口
A(单位、卡牌或状态集合):放在结果前面B(同类集合):追加在A后面
输出端口
Result(单位、卡牌或状态集合):新的拼接集合
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据第一个集合输入连接自动设置,同时应用到两个输入和结果
重复项会被保留,同一个对象同时出现在两个输入中时,也会在结果中出现两次
null 输入集合按空集合处理,输入集合内部已有的 null 元素会被保留
Make Collection
把逐个连接的引用组成集合,适合目标数量很少且来源明确的场景
输入端口
Slot0…SlotN(单位、卡牌或状态引用):每个可见槽位接一个元素,null 输入会被跳过
输出端口
Result(单位、卡牌或状态集合):按槽位顺序组成的新集合
参数
Element Type(Kind)(Unit/Card/Status):Unit;该节点没有来源集合可用于推断,因此需要在这里选择元素类型Slots(Slot Count)(整数):2;动态生成的槽位数量
修改 Slot Count 会重建输入端口,非 null 元素保持槽位顺序,同一个引用可以重复出现
运行时会把 Slot Count 的最小值限制为 1
Random Elements
从集合中随机选择列表位置,同一个位置不会被重复选择,适合从来源集合中取得随机子集
输入端口
Collection(单位、卡牌或状态集合):候选集合Count(整数):需要几个结果,未连接时使用字段值
输出端口
Result(单位、卡牌或状态集合):按随机选中顺序排列的子集
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据Collection自动设置,同时改变结果集合类型Count(整数):1;待选数量的备用值
结果数量不会超过候选数;集合为 null、为空,或数量小于等于零时返回空集合
非空来源集合中的 null 元素仍属于候选,因此可能以 null 项进入结果
如果同一个对象引用在来源集合中占据多个位置,这些位置是独立候选,同一个对象仍可能在 Result 中出现多次
Shuffle
返回随机重排后的集合副本,不会修改来源集合或真实战斗牌堆
输入端口
Collection(单位、卡牌或状态集合):待复制并重排的元素
输出端口
Result(单位、卡牌或状态集合):打乱后的副本,null 输入得到空集合
参数
Kind(内部字段)(Unit/Card/Status):推断前为Unit;根据Collection自动设置,同时改变结果集合类型
如果要打乱真实抽牌堆并触发对应战斗事件,应使用 Shuffle Draw Pile Action
输入中的 null 元素会和其他元素一起保留并参与重排