Playanimation
简介
在基岩版中,/playanimation命令可以让实体播放动画。你可以叠加多个动画,甚至自定义它们。
语法
/playanimation <实体: 目标> <动画: 字符串> [下一状态: 字符串] [过渡时间: 浮点数] [停止条件: 字符串] [控制器: 字符串]
定义:
<> 尖括号表示该变量是必填项。[] 方括号表示该变量是可选项。
<实体: 目标>指定要播放动画的实体。<动画: 字符串>指定要播放的动画。[下一状态: 字符串]指定当前动画的结束条件满足时要过渡到的动画。[过渡时间: 浮点数]设置动画之间的过渡时间。[停止条件: 字符串]定义结束条件。必须使用Molang编写。[控制器: 字符串]访问并定义动画控制器。
示例:
/playanimation @a animation.player.riding.legs none 0 "query.is_moving"这条命令为所有玩家播放animation.player.riding.legs动画(表示玩家坐下时的腿部动作)。当query.is_moving(表示移动)为真时,会在0秒内过渡到none动画。
由于none动画不存在,实体会回到闲置状态,从而取消动画。
如果动画属于实体本身,可以省略animation.entity.部分。
例如,要为玩家播放animation.player.attack.positions,只需输入attack.positions,而不是完整的animation.player.attack.positions。
动画控制器
动画控制器决定在特定条件下播放哪些动画。
如果访问现有的动画控制器,它会被覆盖。
示例
/playanimation @e[type=allay] animation.player.attack.positions none "1" controller.animation.allay.dancing对Allay执行此命令会阻止它在播放音乐时跳舞。
这是因为原始的动画控制器(使它在音乐播放时跳舞)被替换为一个不做任何操作的新控制器。
(这里可以选择任何动画,但attack.positions被选中是因为它没有效果。)
如果指定了一个不存在的动画控制器,它会被注册为新控制器:
/playanimation @a animation.ender_dragon.neck_head_movement animation.piglin.celebrate_hunt_special 0 "v.head_position_y=0;v.head_rotation_y=q.life_time*1000;return !q.is_sneaking;" wiki:head/playanimation @a animation.piglin.celebrate_hunt_special animation.ender_dragon.neck_head_movement 0 "v.head_position_y=0;v.head_rotation_y=q.target_y_rotation;return q.is_sneaking;" wiki:dance这些命令注册了一个新的动画控制器,它会:
- 在玩家未潜行时旋转头部。
- 在玩家潜行时播放跳舞动画。
注意:
如果重复执行,动画可能会闪烁,因为动画过渡时间不匹配(需要1帧的延迟)。
左侧的动画在条件满足时会过渡到右侧的动画。这种过渡可以扩展到更多动画。但过渡仅在同一动画控制器内有效。
例如,如果上述命令正在运行,而另一个动画控制器(如wiki:head.2等)播放animation.piglin.celebrate_hunt_special,它不会影响过渡到animation.ender_dragon.neck_head_movement。
存储与移除
- 动画控制器存储在客户端实体上。
- 它们无法通过命令移除。
- 自定义动画控制器在退出世界或将受影响的实体传送至远处时会重置。
叠加动画
每个动画控制器一次只能播放一个动画。通过使用多个动画控制器,可以同时播放多个动画。
示例
/playanimation @a animation.player.riding.legs none 0 "0" wiki:rideleg这条命令将骑行腿部动画与猪灵跳舞动画叠加:
/playanimation @a animation.piglin.celebrate_hunt_special none 0 "0" wiki:dance这里,wiki:rideleg和wiki:dance用作控制器名称,但任何名称如"a"或"b"也是有效的。不过,不能为多个控制器使用相同的名称(例如都使用"a")。
移除叠加动画
要移除上述动画,必须覆盖动画控制器状态:
/playanimation @a animation.player.attack.positions none 0 "1" wiki:rideleg/playanimation @a animation.player.attack.positions none 0 "1" wiki:dance- 播放**
animation.player.attack.positions**动画(该动画无效果)。 - 条件
1(真)强制过渡到none。 - 由于
none不存在,动画被取消。
为什么不直接使用none作为动画?
- 可以过渡到
none,但不能直接将none设置为动画。 - 动画名称必须有效,否则命令可能无法正常工作。
潜在问题
- 此方法添加了一条从
attack.positions过渡到none的规则。 - 如果任何其他动画已经过渡到
attack.positions,可能会出现意外行为。
错误用法示例
/playanimation @a animation.ender_dragon.neck_head_movement attack.positions 0 "v.head_position_y=0;v.head_rotation_y=q.life_time*1000;return !q.is_sneaking;" wiki:head/playanimation @a attack.positions animation.ender_dragon.neck_head_movement 0 "v.head_position_y=0;v.head_rotation_y=q.target_y_rotation;return q.is_sneaking;" wiki:head这会导致头部仅在潜行时旋转。但如果随后执行:
playanimation @e[tag=main] attack.positions none 0 "1" wiki:head- 当你停止潜行时,动画会过渡到
attack.positions。 - 由于
attack.positions正在播放,它会过渡到none。 attack.positions不再活跃,因此潜行不再触发animation.ender_dragon.neck_head_movement。
解决方法:
不要过渡到attack.positions,而是过渡到另一个无效果的动画。
自定义动画
- 你可以通过修改变量来自定义动画。
- 某些动画包含由
variable控制的角度和位置等元素。 - Minecraft使用自己的脚本语言Molang来定义停止条件——但你也可以用Molang动态改变
variable的值。
示例:编辑鹦鹉的动画
这是animation.parrot.moving JSON文件的一部分:
"animation.parrot.moving": {
"loop": true,
"bones": {
"body": {
"position": [ 0.0, "variable.wing_flap * 0.3", 0.0 ]
},
"tail": {
"rotation": [ "60.0 + math.cos(query.anim_time * 38.17) * 17.0 - this", 0.0, 0.0 ]
},
"wing0": {
"rotation": [ 0.0, 0.0, "-5.0 - variable.wing_flap * 57.3" ]
},
"wing1": {
"rotation": [ 0.0, 0.0, "5.0 + variable.wing_flap * 57.3" ]
}
}
}- 骨骼:
"body"、"tail"、"wing0"和"wing1"是不同的身体部位。 body的y位置由**variable.wing_flap**控制。
现在,用以下命令修改鹦鹉的身体位置:
/playanimation @a animation.parrot.moving none 0 "variable.wing_flap=10;" wiki:body.ypos这会将鹦鹉的身体向上移动。
- 设置
wing_flap=30会使其移动得更高。 - 设置
wing_flap=-10会使其向下移动。
简化语法:
可以将**variable简写为v**:
/playanimation @a animation.parrot.moving none 0 "v.wing_flap=10;" wiki:body_yposvariable.wing_flap和v.wing_flap是相同的。
限制
只有使用
variable的动画才能自定义。- 如果动画没有使用
variable,则无法修改它。
- 如果动画没有使用
默认实体变量每次执行时都会重置。
- 如果循环执行命令:
yaml/playanimation @a animation.player.attack.rotations none 0 "v.attack_body_rot_y=90;" wiki:body.yrot- 会出现闪烁,因为
v.attack_body_rot_y每帧重置后才被重新赋值。
解决闪烁问题:
- 在命令之间添加延迟。
- 使用标签或条件触发一次。
查看原版动画
你可以在这里查看Minecraft原版动画文件:
基岩版示例 - 动画文件
Molang基础
Molang是Minecraft的脚本语言,用于控制动画、条件和表达式。
variable可以简写为**v**query可以简写为**q**
Molang参考:
详细指南请访问:基岩版开发文档 - Molang
实用的Playanimation命令列表
- 这些命令可以应用于玩家和大多数其他实体。
- 示例中所有变量初始化为零,但可以根据需要调整。
- 部分命令使用多个变量。你可以根据需要添加或移除变量。
- 控制器名称(如
wiki:body_yrot)允许在不覆盖先前动画的情况下叠加动画。- 你可以自由更改命名空间(
wiki)或控制器名称。
- 你可以自由更改命名空间(
身体动画
沿Y轴旋转实体身体(不包括四肢和头部):
yaml/playanimation @a animation.player.attack.rotations none 0 "v.attack_body_rot_y=0;" wiki:body_yrot沿Z轴旋转实体身体(不包括四肢和头部):
yaml/playanimation @a animation.wolf.shaking none 0 "v.body_rot_z=0;" wiki:body_zrot
根动画
沿X轴和Z轴旋转整个实体:
yaml/playanimation @a animation.ender_dragon.setup none 0 "v.clamped_pitch=0;v.clamped_roll=0;" wiki:root_xrot_yrotclamped_pitch— 沿X轴旋转整个实体。clamped_roll— 沿Z轴旋转整个实体。
沿X、Y、Z轴偏移整个实体的位置:
yaml/playanimation @a animation.minecart.move none 0 "v.rail_offset.x=0;v.rail_offset.y=0;v.rail_offset.z=0;" wiki:root_posrail_offset.x— 沿X轴偏移整个实体。rail_offset.y— 沿Y轴偏移整个实体。rail_offset.z— 沿Z轴偏移整个实体。
头部动画
偏移或旋转实体的头部:
yaml/playanimation @a animation.ender_dragon.neck_head_movement none 0 "v.head_position_x=0;v.head_position_y=0;v.head_position_z=0;v.head_rotation_x=0;v.head_rotation_y=0;v.head_rotation_z=0;" wiki:head_pos_rothead_position_x— 沿X轴偏移头部。head_position_y— 沿Y轴偏移头部。head_position_z— 沿Z轴偏移头部。head_rotation_x— 沿X轴旋转头部。head_rotation_y— 沿Y轴旋转头部。head_rotation_z— 沿Z轴旋转头部。
(推荐)下一篇:FMBE - 创建显示实体的新方法

