Skip to content

进阶Molang

本页面镜像自
BedrockWiki

根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。

值类型

  • 所有Molang表达式都会返回一个值以便进行相等性检查。大多数表达式返回0。特别地,赋值表达式会返回被赋予的值,循环语句会返回循环体内最后一个解析的值(如果存在)。
  • Molang中的所有值本质上都是单精度浮点数。
  • this用于指代当前字段在运算过程中累积的当前值。目前仅在动画系统中被观察到可用,但可能在其他场景也有用途。例如,如果骨骼在x轴上的缩放变换累积结果为62,那么最终动画中x轴的scale设置为-this时,结果将为-62,这会抵消之前的变换效果。这一特性在大量原版动画中都有应用。在非动画上下文中,this似乎始终解析为0

布尔值

  • 布尔值可在Molang中使用。true解析为1false解析为0

数值

  • 可以在数值前添加前导零(例如0012),以便在代码中对齐。
  • 数值支持科学计数法(如2.5e2等价于250)。指数部分可使用+-符号。
  • 数值可以后缀单个f(常见于原版代码中用于标记浮点数),但目前未发现该符号具有实际功能影响。

字符串

  • 字符串使用\(JSON转义后为\\)作为某种转义符或其他功能。其具体功能尚不明确。已知后续两个字符会被传递给独立子解析器,但该子解析器遇到结束单引号'时无法正确退出。例如Molang字符串"v.type = '\\x';"是无效的。而单独存在的'通常会被视为字符串结束符,但在\后的两个字符中出现时会被允许。
  • 字符串值(多数情况下)以浮点数形式进行增量表示。可以通过等式或比较运算符对单字符字符串进行比较,甚至可对单字符字符串内容进行"调整"。多字符字符串在此类操作中的行为尚不明确。

运算符

运算符优先级列表(从高到低):

  1. ()[]
  2. ->
  3. !-(一元取反)
  4. */
  5. +-(二元减法)
  6. <, <=, >>=
  7. ==!=
  8. &&
  9. ||
  10. ?? :
  11. ??
  12. =
  13. 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)兼容使用。
  • 数组下标结果不可直接作为+, -, *, /的操作数,但可作为函数参数(包括数学函数)或与其他运算符配合使用。

表达式求值

  • initializepre_animation数组中的语句采用延迟连接方式。这些数组中的每个Molang字符串必须独立语法有效,同时所有字符串连接后也需构成有效的Molang输入。

限制条件

  • 除数值大小外,未发现Molang存在合理的功能限制。在极端场景下仍可观察到循环计数、字符串长度、输入长度、集合大小等参数的正常运行。