マイクラのexecuteについて備忘録

executeとは?

なにやら複雑で初見さんバイバイのexecuteコマンド。そんなexecuteも覚えてしまえば、あっちにもこっちにもexecute、どこを見てもexecute。そんな沼のようなコマンドです。

具体的に表現するのならば、コマンドに条件をつけるコマンドです。もっと雑に言うのであれば、ほぼすべてのコマンドに指定できるオプションです。

特に、mcfunctionファイルを使うのであれば必須級のコマンドです。

executeはどうやって使うの?

execute <ほにゃらら> run <コマンド>

上みたいな感じで、<ほにゃらら>部分に条件を書いた上でコマンドを実行するんですね。

基本的には、<ほにゃらら>の部分が結構多いので、私が使う頻度の高いものだけをサクっと説明しちゃいます。

execute <ほにゃらら> の一覧

  • [★★★] 必ず使うレベル
    • as : 誰が実行する
    • at : 誰の場所で実行する
    • if : もしも~だったら実行する
  • [★★] 結構使うレベル
    • unless : もしも~じゃなかったら実行する
    • store : 実行した結果を入れる
  • [★] 使うときは使うレベル
    • positioned : どこで実行する
    • facing : どこを向いて実行する
  • まず使わないレベル
    • anchored : 目/足を向いて実行する
    • align : 座標の小数点を無視して実行する
    • rotated : どこを向いて実行する
    • in : どの世界で実行する

基本はこんな感じです。まず使わないレベルは、本当に使わないので、そういうのがあるんだぁ程度に頭の片隅に置いといてください。まじで私は使わないので

この記事では、★★★~★までのオプションについて、ほんの少しずつ感覚的説明をします。

必ず使うレベル

as : 誰が実行する

まずは、どういうふうに使うか。

# 「プレイヤー全員が」testって言っちゃうコマンド
execute as @a run say test

# 「モブも含めて全員が」testって言っちゃうコマンド
execute as @e run say test

asというのは、エンティティを指定して、そのエンティティがコマンドを使うってオプションです。

@s について

エンティティの指定方法に@p(最も近いプレイヤー)、@a(全プレイヤー)、@r(ランダムに選択されたプレイヤー)、@e(全エンティティ)という種類があるじゃないですか。

その中の一つに@sというものが存在するんですね。

これ、何かというとasで指定したエンティティ(一人でも複数でも)が@sに割り当てられるのです。例えばこういう風に書くのは嫌じゃないですか。

# 普通はtpから後だけ書くけど、簡単な例として。
execute as @e[type=zombie,team=red,tag=aaa] run tp @e[type=zombie,team=red,tag=aaa] 10 60 10

それをこういうふうにかけちゃうんです。

# @sがasで指定した@e[type=zombie,team=red,tag=aaa]と同じ意味になる
execute as @e[type=zombie,team=red,tag=aaa] run tp @s 10 60 10

at : 誰の場所で実行する

まずは、どういうふうに使うか。

# 「全プレイヤーの場所に」石を設置する
execute at @a run setblock ~ ~ ~ stone

# 「ランダムなプレイヤーの場所に」クリーパーを召喚する
execute at @r run summon creeper ~ ~ ~

atというのは、エンティティを指定して、そのエンティティの場所を基準にコマンドを使うってオプションです。さらに、as@sと組み合わせると、もっと複雑なことができます。

# 全プレイヤーを、「とあるモブの場所に」移動させる
execute as @e[tag=point] at @s run tp @a ~ ~ ~

asで「とあるモブ」を指定して、atで「そのモブの場所」を指定すると、こんな感じで書けます。

ちなみに、テキストチャットでexecute無しのコマンドを打つと以下と同じようなことをやっていることになります。

# プレイヤーがその場所でsay test
execute as @p at @s run say test

if : もしも~だったら実行する

まずは、どういうふうに使うか。

execute if entity @p[gamemode=creative] run say "誰かがクリエになっている!"
    
execute if block 10 60 10 stone run say "10 60 10のブロックが石だ!"

execute if score @p SCORE matches 10 run say "誰かのSCOREというscoreboardの値が10だ!"

execute if score @p SCORE matches 1..8 run say "誰かのSCOREという値が1~8だ!"

ifというのは、何かが一致(もしくは存在)していたらコマンドを実行するってオプションです。

こいつがかなり種類が多いのです。つまり、なんでも「もしも」の条件が作れてしまうのです。

  • execute if entity:エンティティがいたら
  • execute if block:ブロックがあったら
  • execute if blocks:とある場所のブロックと一致していたら
  • execute if score:スコアボードの条件が一致していたら
  • execute if data:NBTやストレージが一致していたら
  • execute if predicate:predicateの条件が一致していたら

しかもそれぞれで、かなり深い所まで掘り下げられます。が、実際使うのは上で書いたサンプルがほとんどです。ストレージやpredicateは私は結構使うけど、その辺は過去のブログを参考にしてね。

keiduki.hatenablog.com keiduki.hatenablog.com

結構使うレベル

unless : もしも~じゃなかったら実行する

結論だけ先に書きます。ifの反対です。

ifが成功したら実行だったのに対し、unlessは失敗したら実行です。

execute unless entity @p[gamemode=creative] run say "誰もクリエじゃない!"
    
execute unless block 10 60 10 stone run say "10 60 10のブロックが石じゃない!"

execute unless score @p SCORE matches 10 run say "誰かのSCOREというscoreboardの値が10じゃない!"

execute unless score @p SCORE matches 1..8 run say "誰かのSCOREという値が1~8じゃない!"

ifが使えたら、unlessも使えるようになる。素晴らしいですね。

store : 実行した結果を入れる

まずは、どういうふうに使うか。

# say testって言えたら@pのSCOREに1をいれる。そうじゃなかったら0をいれる。
execute store success score @p SCORE run say test

# SCORE2の@pの値をSCOREの@pにコピーする
execute store result score @p SCORE run scoreboard players get @p SCORE2

# ボスの体力をボスバーに反映する
execute store result bossbar zombie-boss value run data get entity @e[tag=boss,limit=1] Health

storeは実行した結果を取得できる、他のオプションとは少し違うオプションです。

successはコマンドに成功した回数をいれます。ifとよく組み合わせて使いますね。

resultはコマンドで取得した結果をいれます。どちらかと言うと、resultの方がよく使うかも?

しかもこれらの結果はいろんなものに適用できるので、使い方を覚えれば結構、使えますよ。ただし、数値しか入れられないのが惜しいところ。

  • execute store <success|result> block:ブロックのNBTに値を入れる
  • execute store <success|result> bossbar:ボスバーの最大値もしくは現在値に入れる
  • execute store <success|result> entity:エンティティのNBTに値を入れる(プレイヤーは不可)
  • execute store <success|result> score:スコアボードに値を入れる
  • execute store <success|result> storage:ストレージに値を入れる

使うときは使うレベル

positioned : どこで実行する

まずは、どういうふうに使うか。

# 10 60 10の場所に石を置く
execute positioned 10 60 10 run setblock ~ ~ ~ stone

# 「ランダムなプレイヤーの場所に」クリーパーを召喚する
execute positioned as @r run summon creeper ~ ~ ~

positionedは、エンティティだろうが座標だろうが、どこでコマンドを実行するか決められるオプションです。見て分かる通り、positioned asはまさかのatとほとんど同じ意味です。つまり使いません。

座標指定で、好きな場所で実行できるのは嬉しいですね。特にcloneする時とかは。

facing : どこを向いて実行する

まずは、どういうふうに使うか。

# とあるモブが徐々にプレイヤーに近寄ってくる
execute as @e[tag=point] at @s facing entity @p feet run tp @s ^ ^ ^0.2

# 常に10 60 10の方角にパーティクルが出続ける(向こうにラピュタが…)
execute as @a at @s facing 10 60 10 run particle effect ^ ^1 ^2

facingは向いていたとして、その方向に対してコマンドを実行します。

だから、基本的には~ ~ ~ではなく^ ^ ^の向いている方向に対しての座標を指定します。

種類としては、以下があります。

  • execute facing entity <エンティティ> <eyes|feet>:エンティティの足元か頭を見る
  • execute facing <座標>:座標の方を見る

~ ~ ~ の座標と ^ ^ ^ の座標

~ ~ ~は言うまでもなく、それぞれx y zを表しています。

F3キーを押した時に中心に出てくる赤(x)と緑(y)と青(z)の線がこれですね。

# x方向に+1
~1 ~ ~

# y方向に+1
~ ~1 ~

# z方向に+1
~ ~ ~1

それに対して^ ^ ^は頭が向いている方向になります。

# 頭の左に+1
^1 ^ ^

# 頭の上に+1
^ ^1 ^

# 頭の正面に+1
^ ^ ^1

頭なので、視線です。視線なので、動きます。

なれるまでは時間がかかりますが、向いている方向に対してなにかする場合は、避けては通れない道です。

executeコマンドでfunctionコマンドを呼び出す

executeコマンドはあらゆるコマンドのオプションを付けられます。その中でも最も特殊なのが、functionコマンドを呼び出したときの挙動です。例えばこういうふうに呼び出したとしましょう。

execute as @a[team=red] at @s run function x:test

そしてfunctionの中でこういうふうに書くと。

tellraw @s {"text":"こんにちは!"}
tellraw @s {"text":"きょうもいい天気ですね!"}
summon ~ ~10 ~ creeper

なんと、executeのasatが、functionの中の全ての@sや座標に反映されるんです!

同じようなコマンドをいっぱい並べてた人は、executeでfunctionの時代ですよ!!