マイクラをやっていてミニゲームを作りたくなったとき、やり方を調べるとexecuteというコマンドが出てきて「訳がわからない!」となったことはありませんか?
筆者自身もはじめは訳が分からず中々うまくいきませんでしたが、使い方が分かりミニゲームを作るのにかなり役に立っています。
そんなexecuteコマンドについて解説していきます!
基本の構文
まずそもそも構文が分からない人もいると思います。
おそらくこの後説明する「サブコマンド」を説明した後でないとさっぱりだと思いますが大体こんな感じなんだくらいの気持ちで見てください。
/execute <サブコマンド> <セレクター> run <実行したいコマンド>
はい、はっきり言ってさっぱりだと思います。そもそもサブコマンドってなんやねんって話だと思います。
今からそのサブコマンドについて解説していきます。
サブコマンドとは
サブコマンドは先ほどの構文
/execute <サブコマンド> <セレクター> run <実行したいコマンド>
のサブコマンドとセレクターの部分に該当する部分です。
as
まずasについてです。
構文は
as <セレクター>
です。このサブコマンドを使うとasの直後のセレクターがそれ以降のコマンド(サブコマンドを含める)のセレクターの主体になります。
asの後のセレクターに実行者を移すことができます。
sayコマンドを例にすると分かりやすいでしょう。
普通にコマンドブロックにsay aというコマンドを打ち込むと
!はコマンドブロックのことです。つまりsay aをコマンドブロックが実行しました。
しかしこれを
/execute as @p run say a
と打つと
(青で隠されているのは筆者のユーザーネームです)
これによってコマンドブロックの一番近くに居た私が実行者になりました。
at
次はatについてです。
構文はasと同じなので省略します。
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が起点になっています。
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は無い場合コマンドを実行するというものです。
score
スコアを比較する
scoreはscoreboardの誰かのスコアを他の誰かのスコアと比べた時の結果によってコマンドを実行するかを決めるものです。
scoreboardコマンドについてはこちらの記事をご覧ください。
構文は
if(もしくはunless) score <スコアを所持しているセレクター> <スコア名> <等号(もしくは不等号)> <比較対象のスコアを所持しているセレクター> <比較対象のスコア名>
です。
この構文でスコアの値を比べ、=であれば同じとき、不等号であればその不等号が表す条件に合っているときにコマンドを実行します。
matches
matchesは任意のプレイヤーのスコアと数値を比較し、条件に当てはまる場合に実行します。
構文は
if(もしくはunless) score <スコアを所持しているセレクター> <スコア名> matches <比較対象の数値>
です。
数値の部分は以下のような表し方をできます。
x | スコアの値がxの時 |
x.. | スコアの値がx以上の時 |
..x | スコアの値がx以下の時 |
x..y | スコアがx以上y以下の時 |
終わりに
紐解いていくと意外と大して難しくないと思います。
他にもサブコマンドはありますが、今紹介したサブコマンド以外はあんまり使いませんが、今後追記していくつもりです。
それでは!