マイクラをやっていてミニゲームを作りたくなったとき、やり方を調べるとexecuteというコマンドが出てきて「訳がわからない!」となったことはありませんか?
筆者自身もはじめは訳が分からず中々うまくいきませんでしたが、使い方が分かりミニゲームを作るのにかなり役に立っています。
そんなexecuteコマンドについて解説していきます!
executeコマンドとは
executeコマンドは、コマンドに様々な条件や実行場所などの細かいオプションを付けることができるものです。
これを使いこなすことができるとコマンドの幅がかなり広がります。
基本の構文
まずそもそも構文が分からない人もいると思います。
おそらくこの後説明する「サブコマンド」を説明した後でないとさっぱりだと思いますが大体こんな感じなんだくらいの気持ちで見てください。
/execute <サブコマンド> run <実行したいコマンド>
<サブコマンド>にはコマンドに追加する状況や条件を書きます。これらについては今から説明します。
as
まずasについてです。
構文は
as <セレクター>
です。このサブコマンドを使うとasの直後のセレクターがそれ以降のコマンド(サブコマンドを含める)の実行者になります。
asの後のセレクターに実行者を移すことができます。
sayコマンドを例にすると分かりやすいでしょう。
普通にコマンドブロックにsay aというコマンドを打ち込むと

!はコマンドブロックのことです。つまりsay aをコマンドブロックが実行しました。
しかしこれを
/execute as @p run say a
と打つと

(青で隠されているのは筆者のユーザーネームです)
これによってコマンドブロックの一番近くに居た私が実行者になりました。
at
次はatについてです。
構文は
at <セレクター>
です。
atは実行する地点の対象を決めます。
これだけでは分かりづらいと思うので実際に画像を見てみましょう。

動くと

実行したコマンドは
/execute at @p run particle minecraft:campfire_smoke_particle
で、意味は「コマンドブロックの一番近くのプレイヤーを実行地点にして煙のパーティクルを出す」です。もしatがexecuteが無ければコマンドブロックから煙が発せられました。
今回はプレイヤーですが、豚やゾンビなどのmobを実行する場所にもできます。
このようにatを使うと指定のmobの位置からコマンドを実行することができます。
この2つを組み合わせてコマンドを作る際の注意です。
/execute as @p at @s run <任意のコマンド>
これはコマンドブロックに一番近いプレイヤーにそのプレイヤーを起点に適当なコマンドを実行させるコマンドです。
あれ?と思った人もいると思います。
asとatの後のセレクターは同じなのになんで違うのか?
と思ったでしょう。
ですが、これはasの後にすでにコマンドの実行者が@pに決まっているのでそのプレイヤーからして自分、つまり@sが起点になっています。
positioned
こちらはコマンドの実行場所を直接決めることができる場所です。
構文は以下の通りです。
positioned <x座標> <y座標> <z座標>
atに似ていますが、atはエンティティを起点にするのに対してこちらは直接場所を指定することができます。
in
これはディメンションを指定することで、そのディメンションにいることにしてコマンドが処理されるものです。
構文は以下の通りです。
in <overworld/nether/the_end>
<overworld/nether/the_end>の部分ではディメンションを選択します。
これの使い方は主に座標を使用するコマンド(例えばtpコマンドやlocateコマンド)で便利です。
例えば以下のようなコマンドを打つと、ネザーに移動し尚且つネザーでのその座標(今回の場合は150,20,30
)にテレポートします。
/execute in nether run tp 150 20 30
align
これは実行場所の座標の値を整数にするというものです。
このコマンドを使うことでブロック単位で綺麗にコマンドの実行位置を指定できます。
ただし、ややこしいのはただ四捨五入するわけではないということです。
この計算は整数にした後の値が必ず小さくなるようにするという計算をします。
例えば1.8をこの計算で変えると1になります。これは1.8より1の方が小さいからです。一方-5.2という数字があれば-6になります。これも-5.2より-6の方が小さいからです。
そして、構文は
align <整数化する座標の種類>
です。<整数化する座標の種類>とはx,y,zのことでこれらを指定します。xyzのうち整数化したいものを間隔を開けずに並べます。(並びは順不同です。)
例えばY座標とX座標を整数化したい場合はxyまたはyxと書きます。
anchored
これはコマンド実行時のエンティティの位置の基準は普段は足の位置という扱いなのですが、これを使うことで目の位置に変えることができます。
構文は
anchored <feet/eyes>
です。eyesにすることで目を基準に出来ます。デフォルトはfeetなので足にする場合は特に書く必要はありません。
rotated
これはコマンドの実行の向きを決めることができます。コマンドの実行者から見た角度といったイメージが正しいでしょう。
構文は2種類あります。
まず1個目はこちらです。
rotated <横の角度> <縦の角度>
これでこの向きに向かってコマンドを実行します。<横の角度>は0で南、90で西、180(-180)で北、-90で東です。

つまり画像のような角度の基準ということです。
一方<縦の角度>は真上が90、真下が0です。
例えば以下のようなコマンドを打つとします。
/execute rotated 90 45 run tp ^^^1
もし、executeが無ければ実際に向いている方向に1移動しますが、この場合は西に1ブロック移動します。
2つ目はこちらです。
rotated as <セレクター>
これによりコマンドの方向がセレクターで指定した対象の向きになります。
活用方法としては、例えば以下のようなコマンドをコマンドブロックにリピートで打つとプレイヤーが向いた方向で誘導することができる矢を使うことができます。
/execute as @e[type=arrow] at @s rotated as @e[type=player] run tp ^^^0.5
facing
facingはコマンドの方向性を決めるもので、特定の位置やエンティティに向けます。
一見するとrotatedと間違えそうですが、全然違います。

rotatedはコマンド実行者からの方向を指定するイメージです。facingはそれに対して、点を指定するイメージです。つまり実行場所に関わらずある点に向かってコマンドの方向を定めるというイメージが正しいでしょう。
こちらのコマンドも2種類構文があります。1つ目はこちらです。
facing <x座標> <y座標> <z座標>
これを使うことで指定した座標へ方向を定めることができます。
2つ目がこちらです。
facing entity <方向を向けたい対象> <eyes/feet>
こちらは<方向を向けたい対象>に、対象にしたいエンティティのセレクターを入力します。<eyes/feet>で目に対して向けるか足に対して向けるかを選択することができます。
これの活用例として例えば以下のようなコマンドを打つことで少し外しても補正される矢を作ることができます。
/execute as @e[type=arrow] at @s facing entity @e[family=mob,type=!player,r=5] eyes run tp ^^^1
if/unless
これは特定の条件を満たしたとき、もしくは満たさない時にコマンドを実行するという条件を付けるものです。
ifで条件を満たす時、unlessで満たさない時です。
構文は
if(もしくはunless) <条件> <条件の対象>
です。
こちらはasとatと違い、セレクターではなく条件になっています。
ただし、その後に条件によって条件の対象に座標やセレクターが入ることもあります。
これから条件の部分にあたる部分を説明していきます。
entity
これは対象のエンティティが存在する/しない時にrunの後のコマンドを実行するというコマンドです。
構文は
if(もしくはunless) entity <対象のエンティティ>
です。
たとえば
/execute if entity @e[name=test] as @p at @s run summon zombie
意味は「testという名前のエンティティが存在するとき、ゾンビを最寄りのプレイヤーに召喚する」です。
これを実行すると

はい、これだけでは何も起こりません。なぜならtestと言う名前のエンティティがワールドに存在しないからです。
ですが、testという名前の防具立てを召喚すると

こんな感じにゾンビが召喚されました。 (ちなみに動力なし、リピートなので大変なことになってます笑)
unlessはこの逆でもし上のコマンドのifをunlessに書き換えるとtestというエンティティが存在する時にゾンビが召喚されず、存在しないと召喚されます。
今回はたまたま適当な名前のエンティティを条件にしましたが、モブやタグ、スコアボードでも識別できます。
block
if/unless blockはさきほどのif/unless entityのブロックバージョンです。
構文は
if(もしくはunless) block <x y z座標> <ブロックの名前>
です。
これは指定した<x y z座標>に<ブロックの名前>で指定した任意のブロックがifが有る場合、unlessは無い場合コマンドを実行するというものです。
使い方の例として、例えば特定の場所ブロックが破壊されたり、置かれたりしたことを検知出来ます。
blocks
これは指定した範囲内のブロックを比較し、ifの場合ブロックの種類も含め完全に一致している場合、unlessの場合一致していない場合にコマンドを実行するものです。
構文は以下の通りです。
if(もしくはunless)blocks <比較元の座標の始点> <比較元の座標の終点> <比較先の座標の始点> <all/masked>
<比較先の座標の始点>は一番xyz共に一番小さい座標、つまり北西の下側の座標です。順番に間隔をあけて入力してください。
<all/masked>では比較のモードを選択します。
allにすると空気ブロック、つまり何もないところも比較するため、比較元が空気のところに比較先でブロックなどが置かれている場合不一致という判定になります。
maskedにすると空気を無視するため、仮に比較元が空気の場所にブロックが置かれたとしても判定は一致したことになります。
使用例として、例えばブロックを一定の配置で特定の場所に置いたことを条件に何かを起こすことができます。
例えば特定の場所で特定のブロックを置くことで、別で用意したブロックの配置と一致し、置いたブロックは湧きすぎないようにfillコマンドで空気に置き換えることでボスが召喚されるなどのギミックを作ることができます。
score
scoreはスコアボードコマンドの誰かのスコアを特定の数値や誰かの他のスコアと比べた時の結果によってコマンドを実行するかを決めるものです。
スコアボードコマンドについてはこちらの記事をご覧ください。
スコアを比較する
まず、誰かのスコアを誰かの他のスコアと比較する方法です。
構文は
if(もしくはunless) score <スコアを所持しているセレクター> <スコア名> <等号(もしくは不等号)> <比較対象のスコアを所持しているセレクター> <比較対象のスコア名>
です。
この構文でスコアの値を比べ、=であれば同じとき、不等号であればその不等号が表す条件に合っているときにコマンドを実行します。
matches
matchesは任意のプレイヤーのスコアと数値を比較し、条件に当てはまる場合に実行します。
構文は
if(もしくはunless) score <スコアを所持しているセレクター> <スコア名> matches <比較対象の数値>
です。
数値の部分は以下のような表し方をできます。
x | スコアの値がxの時 |
x.. | スコアの値がx以上の時 |
..x | スコアの値がx以下の時 |
x..y | スコアがx以上y以下の時 |
終わりに
紐解いていくと意外と大して難しくないと思います。
他にもサブコマンドはありますが、今紹介したサブコマンド以外はあんまり使いませんが、今後追記していくつもりです。
それでは!
コメント