この記事では、Minecraft Java Edition(バージョン1.20.3)の情報をもとに執筆しています。
そのほかのバージョンや機種などでの動作は保証できません。
こんにちは!
マインクラフターのなつめ(@natsume_717b)です。
この記事では、こんな疑問を解決します!
- if/unless functionで実行した結果がrun以降に影響する
ver.1.20.3にアップデートしたことで、executeコマンドでif function(unless function)を指示できるようになりました。
実際にやってみた様子がこちら。
1.20.3の新要素
— 夏メ│Natsume (@natsume_717b) December 6, 2023
駆け足なのでミスあるかもですが、ざっくりif functionについて解説
(unlessは未検証)
まずmcfunction用意します
中身はこちら
execute as @a[scores={Test_Count=..5}] if entity @s run tellraw @s "スコアは5以下です"
execute as @a[scores={Test_Count=..5}] if entity @s… pic.twitter.com/b2ondmzo2C
functionとあることからfunctionコマンドと関わりがあることは自明ですが、実際にはどのような意味があるのか。
普通にfunctionコマンドを実行するのとは何が違うのか、そういったことを解説していきます。
それでは、見ていきましょう。
if/unless functionで実行した結果がrun以降に影響する
executeコマンドでifもしくはunlessを指定した後に、functionを指示することができます。
その場合functionで指示した関数を実行し、その結果次第でrun以降に記述したコマンドが実行されるかどうか決まります。
具体的には
- 呼び出した関数にreturnコマンドによる戻り値があること
- その戻り値が0でないこと
この2点を守っていれば、if functionではrun以降のコマンドが実行されます。
逆にunless functionの場合は実行されなくなります。
戻り値が0であったり、returnコマンドが存在しない場合には実行されるので、まさしくifとunlessの関係性ですね。
実例をもとに解説
実際のコマンドで見てみましょう。
まずは以下のようなmcfunctionがあったとします。
if/unless functionで呼び出す関数ですね。
execute as @a store result score @a Test_Count run return run xp query @s levels
give @a iron_ingot 1
1行目のコマンドは、コマンドの実行者のレベルを取得しつつ、その値をTest_Countというスコアボードに代入することを指示しています。
スコアボードの作成は以下のコマンドでどうぞ。
/scoreboard objectives add Test_Count dummy
return runを使うことで、実行したコマンドの結果を戻り値とするものですね。
これもver.1.20.3から追加されたものです。
詳しくは以下の記事で解説しています。
2行目はシンプルに鉄のインゴットを付与するgiveコマンドです。
このコマンド自体には解説することありませんが、return runでもreturnコマンド同様に関数を強制的に終了させる仕様があります。
なので、1行目のコマンドが成功した時点で関数の呼び出しを終了させるため、鉄のインゴットが手に入ることはありません。
今回は上記のmcfunctionをntm:testという関数として、実行します。
そして、チャット欄で実行するものがこちら。
/execute if function ntm:test run give @a diamond 1
unlessの場合は以下になります。
/execute unless function ntm:test run give @a diamond 1
レベルが0の状態で実行した場合は、ntm:testの1行目(xpコマンド)で得られる戻り値は0となります。
なので、ifの場合は”run give @a diamond 1″の部分が処理されません。
unlessの場合は、戻り値が0だったということで、”run give @a diamond 1″が処理されてダイヤモンドを入手できます。
仮にレベルが10だとすると戻り値が10となり、逆の結果となります。
ifの場合はrun以降のコマンドが実行されて、unlessであれば実行されないわけです。
if entityなどに比べると少々ややこしいですが、より複雑なことができることは間違いありません。
まとめ
というわけで、今回のまとめです。
- if/unless functionではfunctionコマンドを実行しつつ、その結果でrun以降のコマンドを実行するかどうかが決まる。
- 呼び出す関数にreturnコマンドが含まれていること、そのreturnコマンドによる戻り値が0でないことなどが分岐の条件となる。
この記事は以上になります。
2016年からマイクラを楽しんでおり、最近はクリエイティブモードでコマンドを駆使して遊んでいます!