Molang¶
Molang是Minecraft基岩版中使用的一种轻量级表达式语言(Expression Language),用于在附加包的各类JSON文件中嵌入动态计算逻辑。Molang的名称源自“Mo”(Mojang)和“Lang”(Language),其设计目标是在静态JSON数据与完整脚本语言之间提供一种简洁高效的中间层。
概述¶
在附加包开发中,许多场景需要根据游戏运行时的状态动态地决定某个值,例如实体动画的播放速度、粒子特效的颜色变化、渲染控制器对材质的选择等。Molang正是为这类需求设计的。它允许开发者在JSON文件中编写简短的数学表达式和逻辑判断,无需借助完整的脚本API即可实现相当灵活的动态行为。
Molang在基岩版中被广泛使用,出现在动画、动画控制器、渲染控制器、粒子特效、实体定义、方块定义等几乎所有可数据驱动的定义文件中。Molang表达式通常以字符串形式写在JSON的值中。
数据模型¶
Molang中所有值在基础层面均为浮点数(Float)。布尔逻辑中,0.0被视为假,任何非零值被视为真。字符串仅在少数特定场景下使用,如材质和纹理的名称查找。
Molang还支持结构体(Struct),即具有.x、.y、.z等命名字段的复合值,常用于表示位置和旋转等向量信息。
语法¶
表达式¶
Molang表达式遵循标准的数学运算优先级,支持以下运算符:
| 运算符 | 描述 |
|---|---|
+、-、*、/ | 四则运算 |
==、!=、<、>、<=、>= | 比较运算 |
&&、\|\|、! | 逻辑运算 |
? : | 三元条件运算 |
?? | 空值合并运算 |
多条语句可以用分号;分隔,最后一条语句的值作为整个表达式的返回值。也可以使用return关键字提前返回。
查询函数¶
查询函数(Query Function)是Molang中最核心的组成部分之一,用于从游戏引擎中读取运行时数据。查询函数以query.或缩写q.为前缀,后跟函数名和可选的参数列表。例如:
query.health:获取当前实体的生命值。query.is_sneaking:判断当前实体是否在潜行。query.position(0):获取当前实体在X轴上的坐标。
查询函数是只读的,不能通过Molang修改其返回值。可用的查询函数取决于当前Molang表达式所处的上下文(实体、粒子、渲染控制器等)。
数学函数¶
Molang内置了一系列数学函数,以math.为前缀:
| 函数 | 描述 |
|---|---|
math.sin(x)、math.cos(x)、math.tan(x) | 三角函数(参数为角度制) |
math.asin(x)、math.acos(x)、math.atan(x) | 反三角函数 |
math.atan2(y, x) | 二参数反正切 |
math.abs(x) | 绝对值 |
math.ceil(x)、math.floor(x) | 上取整、下取整 |
math.round(x) | 四舍五入 |
math.clamp(x, min, max) | 将值限制在范围内 |
math.lerp(a, b, t) | 线性插值 |
math.lerprotate(a, b, t) | 旋转线性插值 |
math.hermite_blend(t) | 厄米特平滑插值 |
math.random(min, max) | 生成指定范围内的随机浮点数 |
math.random_integer(min, max) | 生成指定范围内的随机整数 |
math.die_roll(num, min, max) | 模拟掷骰 |
math.die_roll_integer(num, min, max) | 模拟掷骰(整数) |
math.sqrt(x) | 平方根 |
math.pow(base, exp) | 幂运算 |
math.exp(x) | 自然指数 |
math.ln(x) | 自然对数 |
math.mod(x, y) | 取模运算 |
math.pi | 圆周率常量 |
math.min(a, b)、math.max(a, b) | 取最小值、最大值 |
变量¶
Molang支持三种变量类型:
- 实体变量(Entity Variable)
- 以
variable.或v.为前缀。在实体的整个生命周期内持久存在,可读可写。常用于在不同动画、控制器之间传递状态。 - 临时变量(Temp Variable)
- 以
temp.或t.为前缀。仅在当前表达式的求值过程中存在,求值结束后即被销毁。适用于存储中间计算结果。 - 上下文变量(Context Variable)
- 以
context.或c.为前缀。由游戏引擎在特定上下文下提供的只读变量,例如粒子系统中的发射器上下文。
流程控制¶
Molang支持有限的流程控制:
loop(count, expression):循环执行表达式指定的次数。break:跳出当前循环。continue:跳过当前循环迭代的剩余部分。for_each(variable, array, expression):遍历数组中的每个元素。
使用场景¶
Molang在附加包中的典型使用场景包括:
- 动画:控制骨骼的位置、旋转和缩放随时间变化的规律。
- 动画控制器:根据实体的状态决定当前播放的动画及状态之间的转移条件。
- 渲染控制器:动态选择几何体、材质和纹理。
- 粒子特效:控制粒子的发射速率、颜色、大小等属性。
- 实体定义:在组件和事件的条件判断中使用。
- 方块定义:在方块置换的条件中使用。
引擎版本影响¶
Molang的解析行为受清单文件中设置的最低引擎版本影响。不同的引擎版本可能改变某些查询函数的返回值或表达式的求值规则。因此,在升级最低引擎版本时,应注意检查现有Molang表达式是否仍然正确工作。