/playanimation

/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

外部链接


中文翻译/改编自 Minecraft Wiki 原条目,原文作者可由页面历史查看;译文遵循 CC BY-NC-SA 3.0(署名、非商业性使用、相同方式共享)。