1.12で実装された「Function」システムの使い方。コマンドブロックを大きく削減できるぞ【Minecraft】
コマンドブロック無しでコマンドを常時実行する時代に。
Minecraftバージョン1.12のあまり知られていない新要素、「Function」システム。 テキストファイルにコマンドを書き、functionコマンドで一気に実行したり、gameruleコマンドで常時実行させることができる、というコマンドブロックを殺す恐ろしい機能です。つまり、コマンドブロックを使った仕掛けを外部のテキストに置換できるということ。
どうせあまり読まれないので凝った画像とか使わず簡潔に解説しますね。どうせ読まれないので…
[2017年5月18日] functionコマンドの「if」「unless」機能について追記。
※この記事の内容は2024年1月30日現在最新の「1.12-pre4」に準拠しています。今後仕様が変わる可能性もありますのでご注意下さい。
目次
ファンクションって何だよ
配布ワールド作り、コマンドいじりがお好きな皆さん。バージョン1.12で実装された、コマンドの仕掛けの形態を大きく変える、革新的かつ破壊的な「ファンクション」システムをお見せしましょう。
これまで私たちは、コマンドをコマンドブロックの中に一つづつ書いてきました。しかしファンクションシステムがあれば、コマンドを1つのファイルに書き込んだものを実行できちゃうんです。
つまり、ゲーム内からは見えないファイルが、ああしろこうしろとコマンドを指示してくるということ。ワールドにコマンドブロックが1つも無いのに、外部からコマンドを常時実行させることだっててきます。
しかしファンクションシステムはコマンドブロックの上位互換ではありません。コマンドブロックの便利な機能が使えなかったり、回路と接続できないなどの短所もあります。でも、コマンドを簡単に共有・バックアップできたり、愛用しているエディタでコマンドを書いたりできるというのは、技術部の皆さんにとって嬉しくないわけがないですよね。
一見難しそうに見えますが、実装はめちゃくちゃ簡単です。この記事では、フォルダーの場所やファイルの置き方、ファンクションの書き方やfunctionコマンドで呼び出す方法、常時実行する方法を解説します。
テキストファイルを置くfunctionsフォルダーの場所はここ
ファンクションのファイルを置くフォルダーの場所を説明します。
まず使ってるワールドのフォルダーを開いて下さい。
ワールドデータの中のdataフォルダーを開きます。
functionsフォルダーを開きます。このfunctionsフォルダーの中に、”ファンクション”の.mcfunctionファイルを置くのです。
なお、後述するコマンドは「functionコマンド」ですが、フォルダー名は「functions」なのでご注意下さい。
ファンクションを分類するためにフォルダーを作成しよう
テキストファイルを作成する前に、functionsフォルダー内に適当な名前のフォルダーを作りましょう。自分のユーザー名など、世界にひとつだけの名前をおすすめします。
これは「名前空間」といって、他人の作ったファンクションをコピーした際などに名前の衝突を避けるために、自分のファンクションは自分のフォルダーに入れておくのです。
※以降、フォルダーやファイルの名前は半角英数字で書いて下さい。
自分用フォルダーの中に、さらにフォルダーを作成してファンクションを分類しましょう。例えば「event」「boss」「shop」など、仕掛けのカテゴリーごとに分ければ便利です。
ファンクションファイルの書き方。コメントを書けるのが便利
自作したフォルダーの中に、拡張子が.mcfunctionのファイルを作成して、適当な名前を付けます。
mcfunctionファイルの書き方ですが、コマンドを一行に一つづつ書くだけです。しかし、スラッシュは必ず消して下さい。エラーになります。
各コマンドの先頭に「#」を書けば、コマンドをコメントアウト(=無効に)できます。
▲の場合はウサギさんが理不尽にも仲間外れにされてしまいました。かわいそうなウサギさん。
また、コメントにコマンドの用途などを書けば、後で見返したり修正したりする時に分かりやすくなります。JSONだと無理な”コメント”をいくらでも書き放題。ありがとうMojang。ちなみに、改行して行間を空けてもOKなのでご安心ください。
- 注意! テキストファイルはBomなしUTF-8で保存しよう!!
テキストファイルを保存する際は文字コードに注意しましょう。必ず「UTF-8」(Bomなし)で保存します。BOMの有無のチェックボックスがないエディタの場合は「UTF-8N」を選んで下さい。
functionコマンドでファンクションを呼び出して実行しよう
書いたファンクションを呼び出して、コマンドをまとめて実行するには、functionコマンドを使います。
- functionコマンドの書き方
- /function 名前空間:ファイルへのパス
例えばfunctions→napoan→admin→test1.mcfunctionという階層構造の場合は、「ファイルへのパス」はnapoan:admin/test1と書きます。
functions→napoan→adminにtest1.mcfunctionがある状態で/function napoan:admin/test1を実行すると、test1.mcfunctionに書いてあるコマンドが順番に実行されます。テキストに変更を加えたら、/reloadコマンドでリロードするのを忘れずに!
なお、functionコマンドを使った場合は、functionコマンドを実行したエンティティやコマンドブロックがコマンドを実行します。
「if」「unless」機能で条件を付けてファンクションを実行してみよう
マイクラ技術部の皆さんにまたもや衝撃的なニュース。ついにマイクラに「if」「unless」という概念が出現してしまいました。
- 「if」で「指定したターゲットが存在する時のみ」ファンクションを実行するコマンド
- /function 名前空間:ファイルへのパス if セレクター
例えばクリエイティブモードのプレイヤーが/function ファンクションへのパス if @p[m=0]を実行すると、条件に合わないため実行が「スキップ」されます。(実行されない)
- 「unless」で「指定したターゲットが存在しない時のみ」ファンクションを実行するコマンド
- /function 名前空間:ファイルへのパス unless セレクター
逆に「条件に合うターゲットがいない時のみ」実行する「unless」機能もあります。例えばサバイバルモードのプレイヤーが/function ファンクションへのパス unless @p[m=0]を実行すると、実行が「スキップ」されます。
これまでコマンドで「○○したら○○する」といった仕掛けを作る際は、それぞれのコマンドにいちいち条件を付けたり、スコアやタグを付けたり…とちまちまとした作業が必要でした。しかしfunctionコマンドのif/unlessがあれば、「条件分岐」の役割を果たすコマンドが無くても仕掛けを作ることだってできます。と同時に、if/unlessとコマンド内の引数を組み合わせて、より複雑な条件分岐が可能になったということでもあります。
ところで、マイクラ内のコマンドで条件を設定して、実行するコマンドは外部で書く…ってちょっと面倒じゃないですか? どうせならfunctionファイルに条件を書きたいなぁ。
ゲームルール「gameLoopFunction」で常時実行させてみよう
さあ、ファンクションシステムを使って、これまでコマンドブロックを使っていた仕掛けをテキストファイル化してみましょう。
※コマンドブロックの「条件付き」モードや、レッドストーンコンパレーターを使った仕掛けはファンクションに置き換えられませんのでご注意下さい。
functionフォルダー内の好きな場所に.mcfunctionファイルを新規作成しましょう。
コマンドブロックに書いていたコマンドを、1行づつ順番にコピペし、忘れずに行頭のスラッシュを消します。コメント機能も活用しましょう! UTF-8(Bomなし)で保存するのを忘れずに。
ファンクションファイルを保存したら、常時実行を始める前に/reloadコマンドでファンクションを再読込しましょう。
- コマンドを常時実行するgameruleコマンドの書き方
- /gamerule gameLoopFunction 名前空間:ファイルへのパス
パスの指定方法はfunctionコマンドと一緒です。
この例では、functions→napoan→admin→zangeki.mcfunctionに、「Fキーを押すとハサミで周囲のモブに攻撃する」仕掛けのコマンドを書いています。
その場合は /gamerule gameLoopFunction napoan:admin/zangekiと書いて実行しましょう。
「gameLoopFunction」ルールに任意のファンクションを指定すれば、そのファンクション内のコマンドが常時実行されます。もし実行されない場合は、/reloadコマンドでfunctionをリロードしたり、テキストが正しく保存できているか確かめましょう。
1.12のPre2にたまたま「executeコマンドが正しく実行されない」バグがあり、functionの秘密が分かってしまいました。どうやらテキストファイルに書いたコマンドは、サーバー側が座標(0,0,0)で実行するみたいです。つまり何の前触れもなく「現在地を●●するコマンド」を書くと(0,0,0)で何か起こるわけです。たーのしー!
1.12-pre3の時点では、ファンクションの常時実行を解除するコマンドが無いようです… 誰かファンクションファイルを削除する以外の解除方法を教えて頂けないでしょうか。
いかがでしたでしょうか。急ぎ足の解説となってしまいましたが、functionシステムを活用すればコマンドブロックの数を大きく削減できることがお分かりになったと思います。しかしfunctionシステムはコマンドブロックの上位互換というわけではありません。(大事なことなので二回言いました) それぞれの長所短所を理解して、うまく使い分けましょう。
22件のコメント
-
Pick2562017年5月18日いちこめ これはコマンド勢をぶっ殺すね
-
MT2017年5月18日gameLoopFunctionは存在しないものを指定すれば一応止まるみたいですね
-
pensi2017年5月18日使っているのはコマンドのはず… ぶっ壊すのはコマブロの方かな…
-
console tlf2017年5月18日gameLoopFunctionのデフォルト値が"-"なのでこれを打てばいいかもしれません。 /gamerule gameLoopFunction -
-
でんでん (Minecraft ID:denden0816)2017年5月18日俺「愛するコマンドブロックさん…」 俺「死なないで…」 俺「コンパレーターを」 俺「使った装置は」 俺「.mcfunctionファイルじゃあ」 俺「作動しませんし、」 俺「条件付き」 俺「コマンドブロックの」 俺「役割をする」 俺「.mcfunctionファイルなんてぇ、」 俺「ないでえ」 俺「だから、」 俺「コマンドブロックは」 俺「100%」 俺「死ぬわけじゃないよ?」 俺「functionを」 俺「知らなかったら」 俺「作れないよ?」 俺「コマンドブロックの」 俺「出番が」 俺「無くなったら」 俺「コマンドブロック、」 俺「削除要素。」 俺「俺、」 俺「コマンドブロック、」 俺「大好き」 友「キモっw」
-
01 202017年5月18日functionファイルの書き方のとこの一つずつのつが抜けてますよw
-
匿名2017年5月18日ご指摘ありがとうございます。修正しました。
-
ごまとしお2017年5月18日ダンボール戦機懐かしいw
-
game6の人2017年5月18日読むからもっと書いて♡
-
銀猫さん2017年5月19日どっちかって言うと淫夢要素の強いコマンド解説読んでるからもっと淫夢要素増やして♡
-
スラスラ2017年5月20日なんでホモが沸いてるんですかねぇ…(呆れ) はホモって、はっきりわかんだね
-
ぃあむ2017年5月27日急にダン戦で草
-
なめこ裁判官2017年5月28日ファンクションって何だよの下が配布ワールド作り、コメンドいじりがお好きな皆さん。になってますよ
-
匿名2017年5月28日ご指摘ありがとうございます、修正しました。
-
プログラなーいめしだ2017年7月1日スクショにコメントアウトが表示されてますが...
-
プログラマー Genboo2017年7月7日これは嬉しい
-
yayo2562017年8月4日普通にforとif使わせて欲しい、、、 せめてifだけでも、、、 ここで言ってもあれですが
-
ぱるぷんて@ロリコン2017年8月9日一定条件を達成時advancementでfunctionを起動すればそれっぽいことができそう?
-
おたむ2018年1月5日もうJavaScriptあたりを搭載しちゃえばいいと思うの・・・
-
mkm752018年1月6日参考になりましたありがとうございます あと「functions」フォルダの中に「minecraft」フォルダを作ってそこに関数を入れると 前に着く「●●●●●:」が省けるのでお勧め
-
mkm752018年1月6日友「キモッw」はなんとなくわかった でも/functionを実行するのは結局コマンドブロックだから コマンドブロックは永遠に削除されないと思う
-
yuu ki2018年1月28日gtx1080いいなぁ