高级Molang指南
数值特性
- Molang中的所有表达式都会返回一个值用于等式比较。大多数表达式返回
0。特别值得注意的是,赋值语句会返回被赋的值,而循环语句会返回循环体内最后一个有效语句的解析值。 - Molang中的所有数值本质上都是单精度浮点数。
this用于引用字段在求值过程中累积的当前值。目前仅在动画中被确认可用,但可能在其他场景也能使用。例如,如果骨骼在x轴scale属性上累积的变换结果为62,那么最终动画中设置x轴scale为-this将解析为-62,从而取消之前的变换效果。这个特性在官方动画中有多处应用。在非动画上下文中,this似乎始终解析为0。
布尔值
- Molang支持布尔值。
true解析为1,false解析为0。
数字
- 可以在数字前添加前导
0(例如用于代码对齐)。 - 支持科学计数法表示,如
2.5e2等于250。e后可接+或-来指定幂次方向。 - 数字可以后缀单个
f(常用于表示浮点值)。虽然官方代码中有此用法,但未发现其具有实际功能影响。
字符串
- 字符串使用
\(在转义JSON中为\\)作为某种转义符,具体功能尚不明确。已知后续2个字符会被单独解析,且遇到结束符'时不会正常退出。这意味着Molang字符串"v.type = '\\x';"是无效的。正常情况下不允许单独出现的',在\后的2个字符中是被允许的。 - 字符串值(主要)以浮点数形式增量表示。可以使用等式或比较运算符来比较两个单字符字符串,甚至可以"调整"单字符字符串的内容。多字符字符串的行为尚不明确。
运算符优先级
完整优先级列表(从高到低):
()和[]->!和-(一元取反)*和/+和-(二元减法)<、<=、>和>===和!=&&||?和? :??=return
- 除条件运算符外,所有运算符都遵循从左到右的结合律
- 同一语句中不能使用多个
->运算符 - 逻辑运算符支持短路求值
语句特性
- 赋值语句会返回被赋的值。因此可以通过类似
v.iterator_x = (v.iterator_z = math.random_integer(16, 32));的链式赋值从单个值初始化多个变量 - 大括号作用域内的最后一条语句可以省略结尾的
; - 大括号作用域可以用在任何允许表达式的地方。例如
v.spawn_point ?? { v.target = false; };会在v.spawn_point未定义时将v.target设为false
集合操作
- 数组下标的结果不能直接作为
+、-、*或/的操作数,但可以直接用作函数参数(包括数学函数)或与其他运算符一起使用
求值机制
initialize和pre_animation数组采用惰性连接策略。这些数组中的Molang字符串必须各自语法有效,同时所有字符串简单连接后也必须构成有效的Molang输入
限制说明
- 除数值大小外,未发现Molang对语言功能存在合理限制。即使在极端情况下,循环计数、字符串长度、Molang输入长度、集合大小等都能保持正常运作


