74 lines
3.6 KiB
Markdown
74 lines
3.6 KiB
Markdown
---
|
||
title: 进阶Molang
|
||
toc_max_level: 2
|
||
mentions:
|
||
- Ciosciaa
|
||
- TheItsNameless
|
||
---
|
||
|
||
# 进阶Molang
|
||
|
||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||
|
||
## 值类型
|
||
|
||
- 所有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';"`是无效的。而单独存在的`'`通常会被视为字符串结束符,但在`\`后的两个字符中出现时会被允许。
|
||
- 字符串值(多数情况下)以浮点数形式进行增量表示。可以通过等式或比较运算符对单字符字符串进行比较,甚至可对单字符字符串内容进行"调整"。多字符字符串在此类操作中的行为尚不明确。
|
||
|
||
## 运算符
|
||
|
||
运算符优先级列表(从高到低):
|
||
|
||
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`)兼容使用。
|
||
- 数组下标结果不可直接作为`+`, `-`, `*`, `/`的操作数,但可作为函数参数(包括数学函数)或与其他运算符配合使用。
|
||
|
||
## 表达式求值
|
||
|
||
- `initialize`和`pre_animation`数组中的语句采用延迟连接方式。这些数组中的每个Molang字符串必须独立语法有效,同时所有字符串连接后也需构成有效的Molang输入。
|
||
|
||
## 限制条件
|
||
|
||
- 除数值大小外,未发现Molang存在合理的功能限制。在极端场景下仍可观察到循环计数、字符串长度、输入长度、集合大小等参数的正常运行。 |