Files
netease-modsdk-wiki/docs/wiki/documentation/advanced-molang.md
2025-03-20 11:52:46 +08:00

74 lines
3.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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