NarraLeaf

数学

四则运算、取整、随机数、布尔逻辑与比较——全部纯值节点

Math 分类负责算出一个值,而不是存下一个值:四则运算、取整、最小值与最大值、随机数、布尔逻辑和比较。只要下游需要一个数字或一个条件,就用这里的节点——Flow里的If分支、控件尺寸、计数器的下一个值。创建浮窗把 Boolean 与 Compare 两个节点组也并入本分类,因此三者都写在这一页

约定

  • 本页每个节点都是Pure 它们都没有执行引脚。下游读取result时才计算,并且在eventfunctionmacro图中都合法,也可用于 Blueprint Value
  • 不缓存。 每次读取都会重新算一遍,所以从同一个节点拉出两条连线就会求值两次。这对+无所谓,对Random Float就不是
  • 接了线就不看卡片。 说明栏标注「接受卡片内联字面量」的引脚会在节点卡上画出输入框,而这个输入框只在该引脚没有连线时才被读取
  • 凡不是有限数字,一律按 NaN 处理。 数值引脚原样接受有限数字,把truefalse当作10,并解析数字字符串。其余一切——null、留空的卡片输入框、Infinity——都是 NaN,而拿到 NaN 的节点输出 NaN。少接一个操作数,它下游的每个结果都会变成 NaN
  • integer能流入float,反过来不行。 RoundFloorCeil输出integer,可以接到任何float输入;float输出则接不进integer输入。两者都能接入string输入,算出的数字就是这样送进Log

四则运算

两个操作数进,一个数字出

引脚方向类型说明
ain · datafloat接受卡片内联字面量
bin · datafloat接受卡片内联字面量
resultout · datafloat
节点类型结果
+blueprint.math.addab,以及后续追加的操作数
blueprint.math.subtractab
×blueprint.math.multiplyab
÷blueprint.math.dividea除以b
Moduloblueprint.math.moduloa除以b的余数,符号跟随a−73得到−1,不是2

五个节点中只有+能接受两个以上的操作数。卡片上的添加输入控件会追加in_1in_2……,标签从Input 3开始,节点会把它拥有的每个数据输入求和。上表只列出它初始就有的两个引脚

÷不会检查除数。除以零得到Infinity−Infinity0 ÷ 0得到 NaN。两者都活不过下一个节点——本页任何地方都把非有限数字读作 NaN——所以问题会在离那次除法好几个节点之外才暴露出来。先把除数和0比一次

取整与符号

一个操作数进,一个数字出

引脚方向类型说明
valuein · datafloat接受卡片内联字面量
resultout · datafloatintegerRoundFloorCeil输出integer;另外三个输出float
节点类型结果
+1blueprint.math.incrementvalue加一
−1blueprint.math.decrementvalue减一
Absblueprint.math.absvalue的绝对值,去掉符号
Roundblueprint.math.round最接近的整数。恰好一半时向上取,所以2.53−2.5−2
Floorblueprint.math.floor不大于value的最大整数
Ceilblueprint.math.ceil不小于value的最小整数

+1−1只负责算,不负责存。让计数器前进仍然要Get Var+1再接Set Var——见变量

Min 与 Max

引脚方向类型说明
ain · datafloat接受卡片内联字面量
bin · datafloat接受卡片内联字面量
resultout · datafloat
节点类型结果
Minblueprint.math.min所有操作数中的最小值
Maxblueprint.math.max所有操作数中的最大值

Min(最小值)与 Max(最大值)追加操作数的方式和+一样:添加输入控件会追加in_1in_2……,比较覆盖节点上的每个数据输入,而不只是上表那两个。只要其中任何一个操作数不是有限数字,节点就输出 NaN——它不会丢掉那个坏操作数再比较剩下的

Random Float

blueprint.math.randomFloat · Pure

引脚方向类型说明
minin · datafloat接受卡片内联字面量。不是数字时回退为0
maxin · datafloat接受卡片内联字面量。不是数字时回退为1
resultout · datafloat

Random Float(随机浮点数)在[min, max)上均匀取值:min可能取到,max取不到。两个边界会先排序再使用,所以把较大的数接进min得到的仍是同一个区间,既不报错也不会变成空区间

Random Integer

blueprint.math.randomInteger · Pure

引脚方向类型说明
minin · datainteger接受卡片内联字面量。不是数字时回退为0
maxin · datainteger接受卡片内联字面量。不是数字时回退为1
resultout · datainteger

Random Integer(随机整数)在minmax之间的整数上均匀取值,两端都包含——16就是一颗骰子,不是五面的。边界先排序,再向内收成整数(min向上,max向下);如果收完中间什么都不剩,结果就是向上取整后的min

两个随机节点都不接受种子,结果也不会被记住。每次读取都重新掷一次:一个Random Integer接到两个引脚上,两边拿到的是不同的数字,过一会儿再读又是另一个。同一个数字要用两次,就先写进变量

Boolean

这里的输入是boolean,不接受卡片字面量,因此两个操作数都必须接线;没接线的布尔引脚读作false

引脚方向类型说明
ain · databooleanNot上标签为Value
bin · databooleanNot没有这个引脚
resultout · databoolean
节点类型结果
Andblueprint.boolean.and两个操作数都为真时为真
Orblueprint.boolean.or任意一个为真时为真
Notblueprint.boolean.nota取反
Xorblueprint.boolean.xor恰好一个为真时为真

非布尔输入会被转换,而不是被拒绝。有限的非零数字为真,0为假,Infinity为假。字符串先去掉两端空白再忽略大小写匹配:"true""1""yes"为真;"""false""0""no"为假;其余非空字符串都为真

Compare

Equal(等于)和 Not Equal(不等于)两侧都是any,用 JavaScript 的===!==比较,不做任何转换。数字1和字符串"1"不相等;两个分别构造、内容相同的数组也不相等——被检验的是同一性

引脚方向类型说明
ain · dataany
bin · dataany
resultout · databoolean
节点类型结果
Equalblueprint.compare.equalab严格相等时为真
Not Equalblueprint.compare.notEqual不相等时为真

两个引脚都不接受卡片字面量,而没接线的引脚根本解析不出值——于是两个引脚都空着的Equal是拿「什么都没有」和「什么都没有」比,报告true。两边都要接线

四个数值比较节点用的是float,转换规则和本页其余部分一致

引脚方向类型说明
ain · datafloat接受卡片内联字面量
bin · datafloat接受卡片内联字面量
resultout · databoolean
节点类型结果
Greater Thanblueprint.compare.greaterThana大于b
Greater Than Or Equalblueprint.compare.greaterThanOrEquala大于或等于b
Less Thanblueprint.compare.lessThana小于b
Less Than Or Equalblueprint.compare.lessThanOrEquala小于或等于b

只要有一侧解析不成有限数字,这四个都输出false。此时一个比较和它的反面同时为假,所以绝不要把其中一个当成另一个的取反:要取反就用Not,而不是换成相反的那个节点

符号比较

更早的一套比较节点,因为已有的图还在用,所以仍然注册着。形状和数值 Compare 节点相同,规则不同

引脚方向类型说明
ain · datafloat接受卡片内联字面量
bin · datafloat接受卡片内联字面量
resultout · databoolean
节点类型结果
=blueprint.math.equal两个数字相等
blueprint.math.notEqual两个数字不相等
<blueprint.math.lessa小于b
blueprint.math.lessOrEquala小于或等于b
>blueprint.math.greatera大于b
blueprint.math.greaterOrEquala大于或等于b

两个操作数都会先转成数字,所以=认为数字1和字符串"1"相等,而Equal不认。按你要问的问题来选:数值是否相等用=,是否是同一个值用Equal

有一侧不是数字时,输出true,其余五个输出false

本页目录