executeコマンドとは
executeコマンドはminecraftにおけるコマンドシステムの中核を担う存在であり、使いこなせるか否かでコマンドで出来ることが大きく変わる非常に重要なコマンドです。
executeコマンドの主な役割は以下のとおりです。
- コマンド実行者を指定する
- コマンド実行座標を指定する
- 実行条件を指定する
これらの要素を組み合わせて、コマンドを実行させるコマンドとなります。
コマンド初心者にとっては何のことかわからないという人も多いと思います。このページではexecuteコマンドの概要を解説しています。
以下では、簡単な具体例を交えたexecuteコマンドの基本的な概念の説明、条件を複数個つなぎ合わせる使い方、各サブコマンドの詳細、の順で説明していきます。
なおこの記事は、引数や相対・絶対座標などのコマンドの基礎を理解していることを前提にしています。
executeコマンドの基本的な概念
コマンドの実行者と実行座標
まずexecuteコマンドを理解するうえで前提となる「実行者」と「実行座標」について説明します。
実行者とはコマンドを実行するエンティティのことです。例えばプレイヤーがチャット欄から何かコマンドを実行する場合はそのプレイヤーが実行者となります。セレクタで@sと指定したときの対象が実行者です。
実行座標とはコマンドを実行する際の相対座標の基準となる座標です。~や^を使用するとき、値が0もしくは何もつけなかったときにコマンドが実行される座標です。チャット欄からコマンドを実行する場合、プレイヤーが現在いる座標が実行座標となります。
executeコマンドはこの「実行者」や「実行座標」を変更する役割があります。
コマンド実行者の指定
ここからexecuteに関する説明になります。まずコマンドの実行者を指定するものについてですが、以下のようなコマンドを考えます。
/say こんにちは
このコマンドは「こんにちは」とチャットにメッセージを送るコマンドです。このコマンドを自身のチャットから実行すると、[(プレイヤーの名前)]こんにちは、とチャットに表示されます。sayコマンドなのでチャット表示時にコマンド実行者の名前が表示されます。
では次にこのコマンドを、executeコマンドを利用して村人に実行してもらいます。
/execute as @e[type=villager] run say こんにちは
詳細は後程説明しますが、as @e[type=villager] のところで村人(villager)にコマンドを実行してもらうという記述を、run say こんにちは のところで「say こんにちは」というコマンドを実行するという記述をしています。このコマンドをワールド内に村人がいる状態で実行すると[村人]こんにちはとチャットに表示されます。つまり村人が「/say こんにちは」のコマンドを実行したということです。
なお実行者は複数体指定することができ、ワールド内で村人が存在する状態で上記のコマンドを実行すると、ワールド内にいる村人の人数分だけ[村人]こんにちはのメッセージがチャットに送信されます。このように、一度のコマンド実行で複数回のコマンドを実行することができるのもexecuteコマンドの特徴です。
コマンド実行座標の指定
次にコマンド実行座標を指定する使い方です。今度は以下のようなコマンドをexecuteコマンドで実行させたいとしましょう。
/particle minecraft:totem_particle ~ ~ ~
このコマンドは相対座標(0,0,0)にトーテムで復活したときのパーティクルを発生させるコマンドです。チャットから実行すると実行したプレイヤーがいる座標にパーティクルが発生します。
ではこれをexecuteを用いて、村人がいる座標で実行してもらいましょう。
/execute at @e[type=villager] run particle minecraft:totem_particle ~ ~ ~
このコマンドではat @e[type=villager]のところで村人がいる座標をコマンド実行座標とする記述を、run particle minecraft:totem_particle ~ ~ ~ でparticleコマンドを実行するという記述をしています。このコマンドを実行すると、村人がいる座標でパーティクルが表示されます。
ここで1.19.50以前の古い形式のexecuteコマンドを使っていた方に補足ですが、新しいexecuteコマンドでは「実行者」と「実行座標」別々になっています。例えば、
/execute at @e[type=villager] run say こんにちは
と「at」で実行座標を村人に指定してコマンドを実行しても、コマンドの実行者は村人ではありません。チャットから実行すると[村人]こんにちはではなく、[{プレイヤーの名前}]こんにちはとなります。古い形式のexecuteを使っていた方からすると違和感があると思いますが、慣れていきましょう。
実行条件の指定
executeコマンドには実行条件を追加する使い方もあります。先ほどと同様にsayコマンドを実行したいとします。ここの例ではif block を使用して条件を設定します。
execute if block ~ ~-1 ~ stone run say こんにちは
このコマンドはif block ~ ~-1 ~ stoneの部分で、実行座標の1ブロック下が石ブロックである場合に実行する、という条件を記述しています。このコマンドをチャットから実行すると、プレイヤーの足元が石ブロックである場合にのみsayコマンドが実行されます。石ブロック以外の場合はsayコマンドは実行されず、if blockが失敗したというエラーメッセージが表示されます。
複数のサブコマンドを組み合わせる
先ほどの例で出てきた「as」や「at」などはサブコマンドと呼ばれ、executeコマンドではこのサブコマンドを一度のみならず複数回使うことができます。これにより、複雑な条件設定なども可能になります。
複数のサブコマンドを組み合わせる例として、「足元のブロックが石ブロックである村人にsayコマンドを実行させる」という以下のコマンドについて考えます。
execute as @e[type=villager] at @s if block ~ ~-1 ~ stone run say こんにちは
長いので一つずつ確認していきましょう。まず、as @e[type=villager]の部分で実行対象を村人に指定しています。次のat @sの部分では実行座標を実行者の座標に指定しています。今回の場合はすでにas @e[type=villager]の部分で実行者が村人に移っているので、実行座標は各村人がいる場所となります。最後のif block ~ ~-1 ~ stoneでは実行座標の1ブロック下に石ブロックがある場合のみ実行するという条件を付けています。
このコマンドをワールド内で実行すると、村人の足元が石ブロックである場合のみsayコマンドが実行されます。
このように複数のサブコマンドを組み合わせることで、executeコマンドは多様な使い方が可能になります。
サブコマンド一覧
最初の例で出した、at、as、if以外にも多くのサブコマンドがあります。以下では使用できる各サブコマンドの解説を記載しています。なお、たくさんあって一度に理解しきれないという方は、まずは run、at、as、if/unless の四つを覚えるとよいでしょう。これらに比べると他のサブコマンドの使用頻度は低いので余裕があれば覚えていけば大丈夫です。
run
構文
/execute run <コマンド>
コマンドを実行します。何気なく使っていましたが、一応これもサブコマンドになります。run の後に続く部分で実際に実行したいコマンドを記述します。runが無いexecuteコマンドは失敗します。
例
/execute run say hello
「/say hello」を実行する。他のサブコマンドが何もないので「/say hello」をそのまま実行するのと何も変わりません。
as
構文
/execute as <対象:セレクタ> <chainedCommand>
as はコマンドの実行者を指定します。前述しましたが、コマンド実行座標は変わらないことに注意が必要です。セレクタの条件に合致するエンティティが複数いる場合は、それぞれのエンティティがasより後ろの部分を実行します。実行者が見つからない場合はコマンドは失敗します。
例1
/execute as @e[type=villager] run say 私は村人だ
村人が「私は村人だ」とチャットに送信します。
例2(応用)
/execute as @e[type=villager] as @e[type=villager] run say 私は村人だ
asが二重になっています。例えばワールド内に村人A、B、Cがいる場合を考えます。このコマンドを実行すると、まず最初のas @e[type=villager]の部分で実行者がA、B、Cに分かれます。では次のas @e[type=villager]でどうなるかというと、各実行者がas @e[type=villager] ~ を実行するのでAがA、B、Cを実行者に指定、BがA、B、Cを実行者に指定...という風にさらに実行者が分かれます。そのため最終的にsayコマンドは9回実行されることになります。図解すると以下のようになります。
at
構文
/execute at <対象:セレクタ> <chainedCommand>
at はセレクタでエンティティを指定することで、コマンド実行座標および向きをそのエンティティ基準にします。条件に合致するエンティティが複数いる場合は、それぞれの座標でそれ以降のコマンドを実行します。セレクタで指定したエンティティが見つからない場合はコマンドは失敗します。
例1
/execute at @e[type=armor_stand] run setblock ~~~ iron_block
アーマースタンドがいる座標に鉄ブロックを設置します。
例2
/execute as @e[type=armor_stand] at @s tp @s ^ ^ ^1
as @e[type=armor_stand] の部分でアーマースタンドが実行者であることを指定し、at @s で各アーマースタンド自身の座標を実行座標にしています。結果として「/tp @s ^ ^ ^1」のコマンドを各アーマースタンドが各アーマースタンドの座標基準で実行するため、各アーマースタンドが前方に1ブロック分テレポートします。
このような as (セレクタ) at @s の書き方はexecuteを使っていると頻繁に使うので覚えておくとよいでしょう。
positioned
構文
/execute positioned as <対象:セレクタ> <chainedCommand>
/execute positioned <座標:x y z> <chainedCommand>
positioned は実行座標を指定するサブコマンドです。at と違い向きはそのままであくまで座標のみを変更します。指定方法はエンティティ指定してその座標を使用するか、もしくは直接座標を入力することもできます。
例
/execute at @e[type=villager] positioned as @p setblock ^ ^ ^5 iron_block
はじめのatで実行座標、向きが村人基準になりますが、その後positionedで座標はプレイヤー基準になります。結果として実行座標はプレイヤーで向きは村人の状態で5マス先にブロックを置きます。
anchored
構文
/execute anchored <eyes|feet> <chainedCommand>
anchoredはエンティティによって決められた実行座標を「目元基準」か「足元基準」に変更します。これにより、相対座標の基準が変更されます。デフォルトのエンティティの座標は足元なため、基本的に目元にするために使うことになります。
例
/execute at @p anchored eyes run particle minecraft:balloon_gas_particle ~ ~ ~
コマンドの実行座標から一番近くのプレイヤーの目元にパーティクルを表示します。
rotated
構文
/execute rotated as <対象:セレクタ> <chainedCommand>
/execute rotated <左右角度:数値> <上下角度:数値> <chainedCommand>
rotated は向きを指定するサブコマンドです。positionedはatの座標だけバージョンでしたが、こちらは向きだけを変更します。指定方法は positioned と同様にエンティティ指定してそのエンティティの向きを使用するか、もしくは数値で縦横の方向を決めることができます。
数値の場合、左右角度については-90がx正方向、0がz正方向、90がx負方向、180がz負方向になります。上下角度については90がy負方向、-90がy正方向です。また、相対座標も使用可能です。
例1
/execute at @e[type=villager] rotated as @p run particle minecraft:totem_particle ^ ^ ^5
実行座標は村人で向きはプレイヤーの状態でパーティクルコマンドを実行します。
例2
/execute at @p rotated ~ 0 run particle minecraft:totem_particle ^ ^ ^5
プレイヤーを基準として、左右はプレイヤーそのままで上下は0とする向きにしてパーティクルコマンドを実行します。プレイヤーの水平方向のみを参照しているため、プレイヤーの向きにプレイヤーと同じ高さで5ブロック先の座標にパーティクルが表示されます。
facing
構文
/execute facing <座標:x y z> <chainedCommand>
/execute facing entity <対象:セレクタ> <chainedCommand> <eyes|feet>
facingはrotatedと同様に実行の向きのみを指定します。指定した座標またはエンティティの方向に実行者が向くように変更されます。エンティティの場合はそのエンティティの目元の座標を見るのか、足元の座標を見るのかを<eyes|feet>で指定します。
例1
/execute as @a facing 0 0 0 run tp @s ^ ^ ^5
ワールド内のプレイヤーが座標(0, 0, 0)に向かって5ブロック分テレポートします。
例2
/execute as @e[type=armor_stand] at @s facing entity @p eyes run tp @s ^ ^ ^0.5
各アーマースタンドが近くにいるプレイヤーの方向へ0.5ブロック分テレポートします。常時実行するとプレイヤーに追尾するような挙動になります。
align
/execute align <xyz:文字列> <chainedCommand>
alignは指定した座標軸(x, y, z)に基づいて座標を揃えます。ようは小数点以下を切り捨てて整数値の座標に揃えます。指定方法については、「x」や「xyz」のように切り捨てたい座標を指定します。
例
/execute at @e align xz run particle minecraft:balloon_gas_particle ~0.5 ~ ~0.5
エンティティがいる座標にパーティクルを表示します。xとz座標を切り捨ててから0.5ブロック先にパーティクルコマンドを実行しているので、常にエンティティがいるブロックの中央にパーティクルが表示されます。
in
構文
/execute in <ディメンション:(overworld | nether | the_end)> <chainedCommand>
in は実行ディメンションをオーバーワールド 、ネザー 、エンドに変更します。in を使うことによって、プレイヤーやエンティティが現在いないディメンションに対してもコマンドを適用することが可能になります。ただしディメンション先が読み込まれていない場合、fillコマンドなど一部のコマンドは失敗するため、その場合はあらかじめtickingareaで使う予定の座標を常時読み込むようにする必要があります。
また、ネザーは座標が1/8されるため注意が必要です。例えばオーバーワールドで実行座標(30,10,16)をinでネザーに移すと、ネザーでの実行座標は(3,10,2)となります。
配布ワールド等のコマンド制御を行っているワールドでディメンションをまたぐことがまれなため、滅多に使うことがないです。
例
/execute in end run tp @a 0 0 0
ワールドにいるプレイヤーをエンドの座標(0,0,0)にテレポートさせます。なお、/tpはテレポート先のチャンクが読み込まれていなくとも実行が可能です。
if/unless
構文
/execute <if | unless> block <座標:x y z> <ブロック:ブロックID> <ブロックステータス> <chainedCommand>
/execute <if | unless> blocks <開始座標:x y z> <終了座標:x y z> <比較先座標:x y z> <スキャンモード:all | masked> <chainedCommand>
/execute <if | unless> entity <対象:セレクタ> <chainedCommand>
/execute <if | unless> score <対象:セレクタ> <スコア名:文字列> <比較演算子> <比較対象:セレクタ> <スコア名> <chainedCommand>
/execute <if | unless> score <対象:セレクタ> <スコア名:文字列> matches <範囲:整数値の範囲> <chainedCommand>
if/unlessは条件を追加するサブコマンドです。ifの場合は条件が一致しているときに実行され、unlessの場合は条件が不一致であるときに実行されます。
blockは指定した座標が指定したブロックであるかという条件を追加します。ブロックステータスは任意なのでなくても構いません。/testforblockコマンドと同様の働きをします。
blocksは開始座標と終了座標で指定した範囲が比較先座標の範囲と全く同じブロックであるかという条件を追加します。スキャンモードについては、allですべてのブロックを比較しますが、maskedにすると比較元の空気ブロックの部分を比較対象から除外して比較を行います。/testforblocksコマンドと同様の働きをします。
entityは指定したエンティティが存在するかという条件を追加します。/testforコマンドと同様の働きをします。
scoreはスコアボードに関する条件を追加します。/scoreboard players test と同様の働きをします。書き方が二種類あり、二つのエンティティのスコアを比較するものと、一つのエンティティのスコアの値を確認するものがあります。
前者については比較演算子(<, <=, =, >, >=)を用いて条件を追加します。制約として、指定する二つのエンティティはそれぞれ必ず一つである必要があります。
後者については整数範囲(1や1..4など)で指定しますが、scores引数で事足りることがほとんどのため使うことはほぼないです。
例1
/execute at @a if block ~ ~-1 ~ stone run setblock ~ ~-1 ~ grass
at @aで各プレイヤーのいる座標に実行座標を移し、その座標から1ブロック下のブロックを確認します。つまりプレイヤーの足元が石ブロックの場合、草ブロックを置きます。
例2
/execute if blocks 0 10 0 10 20 10 20 10 20 all run say 範囲内のブロックが一致します
座標(0, 10, 0)から(10, 20, 20)の範囲と(20, 10, 20)から(30, 20, 30)の範囲のブロックが一致するときsayコマンドを実行します。
例3
/execute unless entity @e[type=zombie] run say ゾンビを根絶した!
ワールド内に(正確には読み込み範囲内に)ゾンビがいない場合にsayコマンドを実行します。
例4
/execute if score @e[name=Steve,c=1] points > @e[name=Alex,c=1] points run say スティーブの勝ち!
「Steve」という名前が付いたエンティティと、「Alex」という名前が付いたエンティティのpointsスコアを比較して、スティーブの方が大きい場合にsayコマンドを実行します。
まとめ
この記事ではexecuteコマンドについて解説しました。executeコマンドは「実行者を変更する」、「実行座標を変更する」、「条件を追加する」などを行いながらコマンドを実行するコマンドです。使えるサブコマンドは以下の通りです。
- run:コマンドを実行する
- as:実行者を指定する
- at:エンティティで実行座標を指定する
- positioned:座標で実行座標を指定する
- anchored:実行座標を目が基準か足が基準かを指定する
- rotated:実行座標の向きを数値で指定する
- facing:実行座標の向きをエンティティで指定する
- align:座標を整数値にする
- in:ディメンションを変更する
- if/unless:条件を追加する
executeコマンドは複雑ですが、大規模なコマンドシステムを作るうえでは必須コマンドになります。ぜひ身に着けてコマンドをより使いこなせるようになりましょう。
コメント