跳转至

动画表达式

Blockbench的动画时间轴支持在若干数值字段中输入表达式。表达式可用于周期运动、速度控制、变量驱动的表情切换和批量数值处理。基岩版动画导出时,这些表达式通常会以Molang形式进入动画JSON;但Blockbench预览支持的内容不一定都能在Minecraft基岩版中以同样方式运行。

表达式基础

表达式使用接近Molang的语法,并返回数值。0通常表示假,非0表示真。三角函数按角度计算,而不是按弧度计算。

math.sin(query.anim_time * 360) * 10

常见用途包括:

  • query.anim_time驱动循环动作。
  • 用三元条件表达式按变量切换状态。
  • variable.v.保存模型预览时需要复用的值。
  • 在数值滑块中输入*2+-1等表达式,对多个选中元素进行批量处理。

区分Blockbench预览和游戏运行

time等Blockbench便捷变量可能只适用于工具预览。面向基岩版导出的动画应优先使用基岩版可识别的query.anim_timequery.delta_time和标准Molang语法。

关键帧表达式

关键帧的某个轴可以填写固定数值,也可以填写表达式。只有一个关键帧时,整条通道会按表达式持续求值;存在多个关键帧时,Blockbench会先在各关键帧处求值,再按时间插值。

例如,让头部以两秒为周期轻微摆动:

math.sin(query.anim_time * 180) * 8

表达式与平滑或贝塞尔插值并不总是适合混用。需要稳定导出到通用三维格式时,表达式通常会被烘焙为大量普通关键帧。

动画时间更新与混合权重

动画属性中的时间更新表达式决定时间轴如何前进。默认逻辑相当于:

query.anim_time + query.delta_time

把增量乘以2会使动画以两倍速度播放:

query.anim_time + query.delta_time * 2

混合权重用于缩放整段动画的幅度。0.5表示只播放一半幅度,2表示放大为两倍幅度。它适合制作呼吸、抖动、情绪强弱等连续变化效果。

变量占位符

变量占位符面板可以在不直接修改关键帧的情况下运行表达式。它常用于预览某个变量状态,例如表情、装备开关或部件显隐。

v.mouth_shape = 2;
v.eye_shape = 1;

Blockbench还提供仅用于预览界面的输入函数,例如开关、滑块和瞬时按钮。它们能快速调整变量,但不应被当作基岩版原生Molang函数使用。要让游戏内也能切换变量,应在动画指令关键帧、动画控制器或客户端实体逻辑中写入可导出的Molang表达式。

表情与部件显隐

变量驱动的常见做法是为同一部位准备多个骨骼或元素组,再用缩放表达式决定哪一个可见。例如,mouth_1只在v.mouth_shape1时保持原大小,否则缩放为0

v.mouth_shape == 1

随后可以用指令关键帧在不同时间修改变量:

v.mouth_shape = 2;
v.eye_left_shape = 1;
v.eye_right_shape = 1;

这种方法适合制作面部表情、发光部件开关和替换式装饰件。实际导入游戏时,应确认所有变量初始化和切换表达式都能被基岩版客户端执行。

占位输入

Blockbench还提供几种只面向编辑器预览的占位输入。它们能让你在不改关键帧内容的前提下,临时拖动变量、切换开关或触发一次短动作。

v.enabled = toggle('Enabled')
v.mouth_shape = slider('Mouth', 1, 1, 3)
v.blink = impulse('Blink', 0.1)

可用输入主要有:

语法 作用
toggle(name) 创建一个勾选框。开启时返回1,关闭时返回0
slider(name, step, min, max) 创建一个数值滑条,也可以直接输入数字。
impulse(name, duration) 创建一个按钮。按下后会在短时间内返回1,随后恢复成0

这些输入主要用于预览

占位输入是Blockbench界面功能,不是基岩版原生Molang函数。导出给游戏后,是否还能按原样工作,取决于你最后写进JSON的表达式本身,而不是这些编辑器控件。

烘焙表达式

表达式很适合在Blockbench里快速搭动作,但某些导出格式并不直接支持它们。这时就需要把表达式“烘焙”为普通关键帧。

官方推荐的做法是使用Bakery插件:

  1. 安装Bakery插件。
  2. 确保要烘焙的通道有明确的起始关键帧和结束关键帧。
  3. 选中要烘焙的关键帧。
  4. 打开AnimationBake Animations
  5. 调整参数并执行烘焙。

常见参数里,Rate决定生成关键帧的间隔;值越大,关键帧越少,数据量更低,但曲线还原会更粗。Spherical Interpolation会在旋转关键帧之间启用四元数插值,但它和表达式并不总能稳定配合。

速度渐变

动画属性中的Anim Time Update字段不仅能让动画整体加速或减速,也能做局部慢动作。

例如,假设动画时间轴长4秒,而你只想在1.0秒到1.3秒之间把动作放慢到原来的20%,就可以写成:

q.anim_time + q.delta_time * ((q.anim_time > 1 && q.anim_time < 1.3) ? 0.2 : 1)

这类做法常被称为“速度渐变”。它特别适合预览甩头、蓄力、击中瞬间或镜头感更强的动作节奏。

传统导出格式不一定保留这种效果

文档明确说明,这种实时速度控制不会自动延续到glTF等传统导出格式,即使做过烘焙也不一定得到同样结果。

数值输入里的表达式

表达式不只出现在动画关键帧里。Blockbench几乎所有数值输入都能接受表达式,例如:

  • 元素的位置和旋转滑条。
  • UV位置和尺寸。
  • 纹理尺寸。
  • 各类对话框中的数值框。
  • 画笔大小等滑条。

多选时的特殊规则

当一个滑条同时控制多个元素时,Blockbench会用额外规则逐个处理每个元素:

  • +*/开头,表示在原值基础上分别加、乘、除。
  • 因为-已用于负数,减法要写成+-
  • val表示当前字段原值。
  • n表示当前元素在处理列表中的索引。

例如:

表达式 结果
16*4 直接得到64
*2 把所有选中值翻倍。
+-Math.PI 对所有值减去PI
Math.random(0, 8) 给每个选中元素生成不同的随机值。
val < 0 ? 0 : val * 2 把负值钳到0,正值翻倍。

这类表达式非常适合批量处理骨骼偏移、UV或大量元素的位置分布。