MC Toolkit

指南 / 命令与数据

/execute:为什么 as/at 的顺序很重要,以及 store 到底怎么工作

大多数出问题的 execute 命令链,都源于混淆了「谁执行命令」和「在哪里执行」。下面说明每个子命令改变了什么,以及能解决问题的正确顺序,as 搭配 at @s 是这条命令里最常用的组合,忘记加 at @s 也是最常见的错误写法。

/execute 是一条伪装成脚本语言的命令。几乎所有的失败都可以追溯到两个子命令——它们听起来像是在做同一件事,实际上并不是。

as 改变的是「谁」。at 改变的是「哪里」。

  • as <target> —— 替换执行者。@s 现在指的就是那个实体。位置不会移动。
  • at <target> —— 替换位置、朝向和维度。执行者不会改变。

所以下面这条命令毫无用处:

execute as @e[type=zombie] run setblock ~ ~ ~ stone

它会为每个僵尸执行一次,但始终在你脚下,于是一次又一次地在同一个位置放置方块。 正确的写法是两者都用:

execute as @e[type=zombie] at @s run setblock ~ ~ ~ stone

at @s 会重新锚定到 as 刚刚选中的僵尸。as … at @s 是整条命令中最常见的搭配,而漏掉 at @s 则是最常见的 bug。

顺序是从左到右,而且会层层叠加

子命令按顺序执行,每一个都会修改下一个子命令所看到的上下文:

execute as @a at @s positioned ^ ^ ^3 run particle flame
  1. as @a —— 每个玩家执行一次
  2. at @s —— 移动到该玩家处
  3. positioned ^ ^ ^3 —— 在他们视线前方 3 格

把第 2 步和第 3 步对调,positioned ^ ^ ^3 就会根据你的位置和朝向计算—— 随后 at @s 又把它丢弃,直接吸附回玩家身上,于是这个偏移完全丢失了。

脱字符与波浪号

  • ~ ~ ~ —— 相对于位置,与世界坐标轴对齐
  • ^ ^ ^ —— 相对于朝向:左、上、前

脱字符坐标正是 positioned ^ ^ ^3 表示「前方」、而 ~ ~ ~3 表示「向南 3 格」的原因。在同一个坐标三元组里混用两种记法是语法错误。

store 是返回值,不是变量

store 捕获的是命令返回的内容——通常是成功次数或结果值:

execute store result score @s Count run data get entity @s Inventory

有两件事人们经常搞错:

  • result 与 success。 result 是命令产生的数值;success 是它是否执行成功的 1 或 0。统计实体数量需要用 result。
  • store 要放在 run 前面,而且它作用于 run 之后的命令,而不是子命令链。

if 与 unless 会短路

if 和 unless 起过滤作用——测试失败时命令链就此中断。多个 if 子句是「与」的关系。没有「或」;那需要两条独立的命令或一个谓词。

execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...

在高级命令生成器中,一次添加一个子命令来构建命令链,并查看每一步的上下文——它还能用同一个表单处理 data、item、loot、schedule、particle 和 playsound。

高级命令生成器 — Execute 与 Data →

更多指南

查看全部 →