更新日:
asは実行者を変える
asは、その後のコマンドを誰が実行した扱いにするかを変えます。@sの意味が変わるため、セレクターを使う処理で重要です。
/execute as @e[type=minecraft:zombie] run say I am zombieatは実行位置を変える
atは、コマンドをどこの座標で実行するかを変えます。パーティクル、音、ブロック判定、座標指定で重要です。
/execute at @e[type=minecraft:zombie] run particle minecraft:flame ~ ~1 ~ 0 0 0 0 1両方使う形
/execute as @e[type=minecraft:zombie] at @s run particle minecraft:flame ~ ~1 ~ 0 0 0 0 1この形では、各ゾンビを実行者にし、そのゾンビの位置でパーティクルを出します。迷ったときは「誰として」「どこで」を分けて考えると整理しやすいです。
as だけ・at だけだとどうなるか
違いを確かめるには、次の2つを比べるのが分かりやすいです。
/execute as @e[type=minecraft:zombie] run setblock ~ ~2 ~ minecraft:glowstone
/execute at @e[type=minecraft:zombie] run setblock ~ ~2 ~ minecraft:glowstone
1つ目は実行者だけがゾンビに変わり、位置は元のままなので、コマンドを実行した場所の上に1つだけグロウストーンが置かれます。2つ目は各ゾンビの位置で実行されるので、ゾンビそれぞれの頭上に置かれます。
@s が指す相手
as を使うと、run 以降の @s がその対象を指すようになります。at は位置だけを変えるため、@s は元の実行者(プレイヤーやコマンドブロック)のままです。
/execute as @a run tellraw @s {"text":"あなた宛てのメッセージ"}
この場合、全プレイヤーそれぞれに本人宛てのメッセージが届きます。as を外して /tellraw @s ... をコマンドブロックで実行すると、@s はコマンドブロック自身になり、誰にも表示されません。
順番を逆にすると
as @a at @s は「各プレイヤーとして、そのプレイヤーの位置で」実行します。一方 at @s as @a は「元の実行者の位置で、各プレイヤーとして」実行するため、位置はプレイヤーごとに変わりません。execute は左から順に処理されることを覚えておくと、意図しない動きを防げます。
よくある組み合わせ
as @a at @s if block ~ ~-1 ~ ...:足元のブロックで判定するas @e[type=...] at @s run particle ...:Mobの位置に演出を出すas @p at @s run tp @s ^ ^ ^3:向いている方向へ3ブロック進める
at と positioned as の違い
at は位置に加えて、向きとディメンションも対象に合わせます。positioned as は位置だけを合わせ、向きは元のままです。^(ローカル座標)を使うときは向きが関係するので、対象の向きを使いたいなら at、元の向きのままにしたいなら positioned as を選びます。
うまくいかないときの確認ポイント
- 1か所でしか起きない:
asだけでatがありません。at @sを足します。 - メッセージが誰にも届かない:コマンドブロックの
@sはブロック自身です。as @aを付けて、実行者をプレイヤーにします。 - 処理が重い:
as @eは当てはまるすべてのエンティティの数だけくり返します。type=やdistance=で絞ります。
よくある質問
統合版でも同じですか?
統合版1.19.50以降は、Java版と同じ as・at の考え方で書けます。距離の条件は r= で書く点が違います。
実行者が誰になっているか確かめるには?
run say テスト を付けて実行すると、チャットに実行者の名前が表示されます。何回表示されたかで、何回実行されたかも分かります。