/playanimation
来源:Commands/playanimation;原文修订 ID:3784035。
本命令仅适用于基岩版和教育版;权限等级为 1,需要启用作弊。
向客户端发送动画请求,使一个或多个实体播放动画。脚本 API 中的对应功能为 Entity.playAnimation。
用法
本命令只向客户端发送动画请求,服务端完全不处理动画。若目标实体没有在客户端载入,该客户端不能接收动画请求。客户端依据其资源包内容处理请求,因此同一服务器上使用不同资源包的玩家可能看到不同动画。
动画控制器
动画控制器是状态机。状态机是一种特殊的逻辑管理方式,依赖一系列状态;每个状态包含“当前状态要做什么”“转移”“转移到其他状态时的淡出时长”三个属性。每个转移包含目标状态以及进入目标状态的条件。状态机同一时间只能处于一个状态。
例如,对玩家的 controller.animation.player.root 动画控制器播放动画后,潜行、行走、手部运动、游泳、睡眠、跳跃等其他玩家动画均不再播放,直到控制器返回原版状态。
动画控制器有两类状态:
动画指定状态(Animation Specified State)
- 由
/playanimation创建。 - 没有名称,用
animation作为唯一标识。 animation指定当前状态的行为,blend_out_time指定淡出时长,另有转移列表;每个转移包含next_state和stop_expression。- 转移列表有序,每个游戏刻优先检查较早加入的转移。多个条件同时满足时,只执行最早加入的转移。
资源包定义状态(Resource Pack Defined State)
- 由资源包定义。
- 有名称,并以名称作为唯一标识。
animations指定当前状态行为,transitions指定转移,blend_transition指定淡出时长。- 转移列表有序,每个游戏刻优先检查靠前转移;多个条件同时满足时只执行列表最上方的转移。
/playanimation 无法直接操作资源包定义状态;唯一的关联方式是向动画指定状态添加一个转移,使其 next_state 指向资源包定义状态。
资源包可为实体类型定义包含若干资源包定义状态的动画控制器,见官方动画控制器文档。本命令也可按下文方式创建控制器。行为包中也有在服务端运行的动画控制器,但它们不控制动画。
实体上的动画控制器不保存;实体在客户端卸载,或玩家离开并重新进入游戏时会清除。最小化或切出客户端游戏窗口而重新载入资源包时,实体动画控制器回到默认状态,但控制器中的状态不会清除。玩家打开更衣室时,其 controller.animation.player.root 返回默认状态,但其中状态不会清除。
行为
客户端收到请求后,若目标实体上尚无指定控制器,先创建控制器。随后向其中添加以指定 animation 为标识的新动画指定状态,设置该状态的 blend_out_time,再添加具有指定 next_state 和 stop_expression 的转移。最后将控制器当前状态设为此新状态。
若指定控制器及指定 animation 的动画指定状态已存在,客户端先更新该状态的 blend_out_time。若其中没有同时具有相同 next_state 和相同 stop_expression 的转移,则添加新转移。最后将控制器当前状态设为此状态。
指定资源包定义的控制器时,处理方式相同。但命令不能直接操作资源包定义状态,因此播放完动画后若要返回资源包定义状态,必须保证某动画指定状态存在一个 next_state 指向该资源包定义状态的转移。
动画列表
此列表不完整,主条目为动画名称。表中“—”表示原文未填写;不代表不支持。
| 名称 | 说明 | 加入版本 | 可叠加 | 需要动画控制器 | 可能用途 | 教育版可用 |
|---|---|---|---|---|---|---|
animation.humanoid.base_pose |
播放 Minecraft Classic 的原始玩家动画。 | — | 否 | 否 | 重置任意动画 | — |
animation.ghast.scale |
将身体、腿和手臂缩放为恶魂大小。 | — | 是 | 否 | — | — |
animation.humanoid.riding.legs |
骑乘生物时使用的坐姿动画。 | — | — | — | — | — |
animation.humanoid.celebrating |
掠夺者庆祝袭击胜利时播放的动画。 | — | — | — | — | — |
animation.humanoid.big_head |
缩放头部。 | — | — | — | — | — |
animation.agent.move |
使身体悬浮。 | — | — | — | — | — |
animation.armor_stand.athena_pose |
— | — | — | — | — | — |
animation.armor_stand.brandish_pose |
— | — | — | — | — | — |
animation.armor_stand.cancan_a_pose |
— | — | — | — | — | — |
animation.armor_stand.cancan_b_pose |
— | — | — | — | — | — |
animation.armor_stand.default_pose |
使角色摆出盔甲架姿态。 | — | — | — | — | — |
animation.armor_stand.entertain_pose |
— | — | — | — | — | — |
animation.armor_stand.hero_pose |
— | — | — | — | — | — |
animation.armor_stand.honor_pose |
— | — | — | — | — | — |
animation.armor_stand.no_pose |
保持直立姿态且没有动画。 | — | — | — | — | — |
animation.armor_stand.riposte_pose |
— | — | — | — | — | — |
animation.armor_stand.salute_pose |
— | — | — | — | — | — |
animation.armor_stand.solemn_pose |
— | — | — | — | — | — |
animation.armor_stand.zombie_pose |
— | — | — | — | — | — |
animation.creeper.swelling |
将角色缩减为一双腿。 | 1.16.100 | — | — | — | — |
animation.minecart.move |
— | — | — | — | — | — |
animation.camel.walk |
使身体摇晃。 | 1.20 | — | — | — | — |
animation.camel.sit_down |
使角色进入地面。 | 1.20 | — | — | — | — |
animation.camel.sit |
将角色置于地面中。 | 1.20 | — | — | — | — |
animation.camel.stand_up |
开始时角色在地面中低头,随后缓慢抬头并升起。 | 1.20 | — | — | — | — |
animation.camel.dash |
使头部剧烈上下弹动。 | 1.20 | — | — | — | — |
animation.sniffer.walk |
使身体上部上下跳动并缓慢左右摇摆。 | 1.20 | — | — | — | — |
animation.sniffer.longsniff |
缓慢抬头,然后恢复正常。 | 1.20 | — | — | — | — |
animation.sniffer.search |
低头并左右摇头,仿佛在寻找东西。 | 1.20 | — | — | — | — |
animation.sniffer.dig |
先使腿部变小,再像挖掘一样摇头,随后腿部恢复正常大小。 | 1.20 | — | — | — | — |
animation.sniffer.stand_up |
先使腿部变小,再恢复正常大小。 | 1.20 | — | — | — | — |
animation.sniffer.feeling_happy |
— | 1.20 | — | — | — | — |
animation.humanoid.tooting_goat_horn |
使右手向前指。 | 1.20 | — | — | 可指向手中物品以便展示。 | — |
animation.humanoid.holding_brush |
使手中物品变大。 | 1.20 | 是 | — | — | — |
animation.humanoid.brushing |
使手持物品像刷子一样移动。 | 1.20 | — | — | — | — |
animation.armadillo.peek |
先左右摇头,然后使头部错位。 | 1.21 | — | — | — | — |
animation.armadillo.unroll |
— | 1.21 | — | — | — | — |
animation.breeze.idle |
缓慢上下移动头部。 | 1.21 | — | — | — | — |
animation.breeze.jump |
身体蓄力后跳得很高。 | 1.21 | — | — | — | — |
animation.breeze.shot |
— | 1.21 | — | — | — | — |
animation.player.holding_heavy_core |
使手中物品变小。 | 1.21.50 | 是 | — | — | — |
animation.armor_stand.holding_heavy_core |
与 animation.player.holding_heavy_core 相同。 | 1.21.50 | — | — | — | — |
animation.creaking.walk |
移动时抽搐。 | 1.21.50 | — | — | — | — |
animation.creaking.attack |
身体抽搐。 | 1.21.50 | — | — | — | — |
animation.creaking.sway |
手臂抽搐。 | 1.21.50 | — | — | — | — |
animation.creaking.twitch |
玩家抽搐。 | 1.21.50 | — | — | — | — |
语法
playanimation <entity: target> <animation: string> [next_state: string] [blend_out_time: float] [stop_expression: string] [controller: string]
参数
entity: target
CommandSelector<Actor>:目标实体。
animation: string
basic_string:通过指定动画来指定一个动画指定状态;该状态被添加至控制器,并成为当前状态。
应为动画名称,例如适用于任意实体类型的 animation.wolf.angry,或资源包文件 <a_resource_pack>/entity/<entity_name>.entity.json 的 JSON 路径 "minecraft:client_entity"."animations" 下定义的动画简写,例如仅适用于狼的 wolf_angry。该路径下的动画控制器简写在此无效。
使用以 .v1.0 结尾的动画时须小心,可能与当前世界版本不兼容,导致卡顿甚至崩溃。若输入字符串不是资源包中的有效动画,客户端完全不响应动画请求。
next_state: string
basic_string:通过动画(对应动画指定状态)或名称(对应资源包定义状态)指定 next_state,默认 "default"。
可使用资源包文件 <a_resource_pack>/entity/<entity_type>.entity.json 的 "minecraft:client_entity"."animations" 路径下定义的动画简写,例如仅用于狼的 wolf_angry。该路径下的动画控制器简写无效;动画全名也无效。
也可以是 <a_resource_pack>/animation_controllers/<entity_type>.animation_controller.json 文件的 JSON 路径 "animation_controllers"."<controller_name>"."states" 下的资源包定义状态名。
若资源包定义状态与动画简写同名,下一个状态会成为动画指定状态,同时播放该资源包定义状态中的动画及简写对应动画。
若字符串是有效动画简写,但控制器中不存在对应动画指定状态,控制器仍能转移到这个不存在的状态并卡住,无法再转移;直到另一条 /playanimation 创建该状态,或命令将控制器改到其他状态。若字符串既非有效动画简写,也非资源包定义状态名,下一个状态会成为不播放任何动画的动画指定状态。
blend_out_time: float
状态转移到其他状态时的淡出时长,浮点数,默认为 0。
stop_expression: string
basic_string:进入下一状态的条件,应为 Molang 表达式,默认 query.any_animation_finished。
例如要在玩家开始潜行时结束动画,可用 "query.is_sneaking" 或 "return query.is_sneaking;"。执行以下两条命令后,玩家跳跃时会在两个动画间快速切换:
/playanimation @a riding.legs riding.arms 0 query.is_jumping controller_name
/playanimation @a riding.arms riding.legs 0 query.is_jumping controller_name
控制器处于该状态(由 animation 指定的动画指定状态)时,此 Molang 表达式每个游戏刻执行一次,因此也可用于设置实体 Molang 变量。例如 "variable.test_variable = 1234; return 0;" 会将 variable.test_variable 设为 1234。也可以一次设置多个变量,如 "variable.test_variable_a = 1234; variable.test_variable_b = -9876; return 0;",每条语句须以分号分隔。此方法对需要设置特定实体 Molang 变量才能正常运行的动画很有用。
注意:return 0; 用于让控制器保持在当前状态;没有 return 表达式的复杂 Molang 表达式默认返回 0,因此可省略,例如 "variable.variable_name = value;"。但值之后的分号必须保留,否则只会产生内容日志错误。该操作仅在客户端生效:只有执行命令时已载入该实体的客户端会设置变量,实体卸载时变量重置。
还应注意前述多个转移的检查顺序。已有转移若 next_state 和 stop_expression 均相同,不能重复添加;在 stop_expression 中增加空格可绕过这种重复检查。要成功设置 Molang 变量,animation 参数必须是有效动画。
controller: string
basic_string:目标实体上的控制器,默认 "__runtime_controller"。可为任意字符串,也可以是资源包文件 <a_resource_pack>/animation_controllers/<entity_type>.animation_controller.json 中 JSON 对象 "animation_controllers" 下定义的控制器。
结果
参数不正确时无法解析。目标未解析到一个或多个在线实体时失败,指定名称的玩家必须在线;其他情况成功。
输出
失败时成功次数为 0,成功时为 1。
示例
- 使全部猪灵蛮兵跳“胜利之舞”:
/playanimation @e[type=piglin_brute] animation.piglin.celebrate_hunt_special a 0。 - 让所有狐狸坐下直到离开地面,离地后进入睡眠状态:
/playanimation @e[type=fox] sit sleep 0 "!query.is_on_ground" controller_name;或/playanimation @e[type=fox] sit sleep 0 "query.is_on_ground == 0.0" controller_name。 - 使实体非常大(改变最后一个值并重跑可继续放大):
/playanimation @s animation.ghast.scale a 0 false la。 - 使所有玩家坐下直到移动:
/playanimation @a animation.player.riding.legs a 0 query.is_moving controller_name。 - 使所有玩家的腿倒转进身体中,直到跳跃:
/playanimation @a animation.player.move.legs.inverted a 0 query.is_jumping controller_name。 - 冻结玩家身体并停止全部玩家动画;控制器必须为
controller.animation.player.root:/playanimation @s sleeping a 0 true controller.animation.player.root。 - 使玩家倒立,先运行上一条冻结命令,再依次执行:
/playanimation @s animation.player.base_pose.upside_down a 0 false a
/playanimation @s animation.player.move.legs.inverted a 0 false b
/playanimation @s animation.player.holding a 0 false c
/playanimation @s animation.player.bob a 0 false d
/playanimation @s animation.player.look_at_target.inverted a 0 false e
/playanimation @s animation.player.move.arms a 0 false f
/playanimation @s animation.player.attack.positions a 0 false g
/playanimation @s animation.player.attack.rotations a 0 false h
外部链接
- Microsoft Learn:/playanimation 命令(2023-10-11)。
中文翻译/改编自 Minecraft Wiki 原条目,原文作者可由页面历史查看;译文遵循 CC BY-NC-SA 3.0(署名、非商业性使用、相同方式共享)。