进阶Molang
本页面镜像自 BedrockWiki
根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。
值类型
- 所有Molang表达式都会返回一个值以便进行相等性检查。大多数表达式返回
0。特别地,赋值表达式会返回被赋予的值,循环语句会返回循环体内最后一个解析的值(如果存在)。 - Molang中的所有值本质上都是单精度浮点数。
this用于指代当前字段在运算过程中累积的当前值。目前仅在动画系统中被观察到可用,但可能在其他场景也有用途。例如,如果骨骼在x轴上的缩放变换累积结果为62,那么最终动画中x轴的scale设置为-this时,结果将为-62,这会抵消之前的变换效果。这一特性在大量原版动画中都有应用。在非动画上下文中,this似乎始终解析为0。
布尔值
- 布尔值可在Molang中使用。
true解析为1,false解析为0。
数值
- 可以在数值前添加前导零(例如
0012),以便在代码中对齐。 - 数值支持科学计数法(如
2.5e2等价于250)。指数部分可使用+或-符号。 - 数值可以后缀单个
f(常见于原版代码中用于标记浮点数),但目前未发现该符号具有实际功能影响。
字符串
- 字符串使用
\(JSON转义后为\\)作为某种转义符或其他功能。其具体功能尚不明确。已知后续两个字符会被传递给独立子解析器,但该子解析器遇到结束单引号'时无法正确退出。例如Molang字符串"v.type = '\\x';"是无效的。而单独存在的'通常会被视为字符串结束符,但在\后的两个字符中出现时会被允许。 - 字符串值(多数情况下)以浮点数形式进行增量表示。可以通过等式或比较运算符对单字符字符串进行比较,甚至可对单字符字符串内容进行"调整"。多字符字符串在此类操作中的行为尚不明确。
运算符
运算符优先级列表(从高到低):
()和[]->!和-(一元取反)*和/+和-(二元减法)<,<=,>和>===和!=&&||?和? :??=return
- 除条件运算符外,所有运算符均按从左到右顺序执行。
- 同一语句中不可重复使用
->运算符。 - 逻辑运算符具有短路特性。
语句
- 赋值语句会返回被赋予的值。因此可以进行链式赋值(例如
v.iterator_x = (v.iterator_z = math.random_integer(16, 32));)。 - 大括号作用域内的最后一条语句无需以
;结尾。 - 大括号作用域可以在任何表达式可用的位置使用。例如
v.spawn_point ?? {v.target = false;};会在v.spawn_point未定义时将v.target设为false。
集合类型
- 实体可迭代对象(如
q.get_nearby_entities的结果)属于独立"类型",不可与下标运算符兼容使用。 - 数组类型同样无法与实体可迭代操作(如
q.count)兼容使用。 - 数组下标结果不可直接作为
+,-,*,/的操作数,但可作为函数参数(包括数学函数)或与其他运算符配合使用。
表达式求值
initialize和pre_animation数组中的语句采用延迟连接方式。这些数组中的每个Molang字符串必须独立语法有效,同时所有字符串连接后也需构成有效的Molang输入。
限制条件
- 除数值大小外,未发现Molang存在合理的功能限制。在极端场景下仍可观察到循环计数、字符串长度、输入长度、集合大小等参数的正常运行。