进阶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存在合理的功能限制。在极端场景下仍可观察到循环计数、字符串长度、输入长度、集合大小等参数的正常运行。