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ブロック進める