メインコンテンツまでスキップ
probot-auto-merge[bot]が最終更新

1.12で実装された「Function」システムの使い方。コマンドブロックを大きく削減できるぞ

function解説

コマンドブロック無しでコマンドを常時実行する時代に。

Minecraftバージョン1.12のあまり知られていない新要素、「Function」システム。 テキストファイルにコマンドを書き、functionコマンドで一気に実行したり、gameruleコマンドで常時実行させることができる、というコマンドブロックを殺す恐ろしい機能です。つまり、コマンドブロックを使った仕掛けを外部のテキストに置換できるということ。
どうせあまり読まれないので凝った画像とか使わず簡潔に解説しますね。どうせ読まれないので…

[2017年5月18日] functionコマンドの「if」「unless」機能について追記。

※この記事の内容は現在最新の「1.12-pre4」に準拠しています。今後仕様が変わる可能性もありますのでご注意下さい。

ファンクションって何だよ#

配布ワールド作り、コマンドいじりがお好きな皆さん。バージョン1.12で実装された、コマンドの仕掛けの形態を大きく変える、革新的かつ破壊的な「ファンクション」システムをお見せしましょう。

ファンクション!!

これまで私たちは、コマンドをコマンドブロックの中に一つづつ書いてきました。しかしファンクションシステムがあれば、コマンドを1つのファイルに書き込んだものを実行できちゃうんです。

functionとは

つまり、ゲーム内からは見えないファイルが、ああしろこうしろとコマンドを指示してくるということ。ワールドにコマンドブロックが1つも無いのに、外部からコマンドを常時実行させることだっててきます。

メリットとデメリット

しかしファンクションシステムはコマンドブロックの上位互換ではありません。コマンドブロックの便利な機能が使えなかったり、回路と接続できないなどの短所もあります。でも、コマンドを簡単に共有・バックアップできたり、愛用しているエディタでコマンドを書いたりできるというのは、技術部の皆さんにとって嬉しくないわけがないですよね。

一見難しそうに見えますが、実装はめちゃくちゃ簡単です。この記事では、フォルダーの場所やファイルの置き方、ファンクションの書き方やfunctionコマンドで呼び出す方法、常時実行する方法を解説します。

テキストファイルを置くfunctionsフォルダーの場所はここ#

ファンクションのファイルを置くフォルダーの場所を説明します。

ワールドフォルダーを開く

まず使ってるワールドのフォルダーを開いて下さい。

dataフォルダー

ワールドデータの中のdataフォルダーを開きます。

functionsフォルダー

functionsフォルダーを開きます。このfunctionsフォルダーの中に、”ファンクション”の.mcfunctionファイルを置くのです。
なお、後述するコマンドは「functionコマンド」ですが、フォルダー名は「functions」なのでご注意下さい。

ファンクションを分類するためにフォルダーを作成しよう#

適当な名前のフォルダーを作る

テキストファイルを作成する前に、functionsフォルダー内に適当な名前のフォルダーを作りましょう。**自分のユーザー名など、世界にひとつだけの名前をおすすめします。**

これは「名前空間」といって、他人の作ったファンクションをコピーした際などに名前の衝突を避けるために、自分のファンクションは自分のフォルダーに入れておくのです。

※以降、フォルダーやファイルの名前は半角英数字で書いて下さい。
さらにフォルダーを作る
自分用フォルダーの中に、さらにフォルダーを作成してファンクションを分類しましょう。例えば「event」「boss」「shop」など、仕掛けのカテゴリーごとに分ければ便利です。

ファンクションファイルの書き方。コメントを書けるのが便利#

mcfunctionファイルを作成

自作したフォルダーの中に、拡張子が.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と書きます。

functionコマンドを使ってみた

functions→napoan→adminにtest1.mcfunctionがある状態で/function napoan:admin/test1を実行すると、test1.mcfunctionに書いてあるコマンドが順番に実行されます。テキストに変更を加えたら、/reloadコマンドでリロードするのを忘れずに!

なお、functionコマンドを使った場合は、functionコマンドを実行したエンティティやコマンドブロックがコマンドを実行します。

「if」「unless」機能で条件を付けてファンクションを実行してみよう#

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と書いて実行しましょう。

reloadためせ

「gameLoopFunction」ルールに任意のファンクションを指定すれば、そのファンクション内のコマンドが常時実行されます。もし実行されない場合は、/reloadコマンドでfunctionをリロードしたり、テキストが正しく保存できているか確かめましょう。

gameLoopFunctionの仕様

1.12のPre2にたまたま「executeコマンドが正しく実行されない」バグがあり、functionの秘密が分かってしまいました。どうやらテキストファイルに書いたコマンドは、サーバー側が座標(0,0,0)で実行するみたいです。つまり何の前触れもなく「現在地を●●するコマンド」を書くと(0,0,0)で何か起こるわけです。たーのしー!

1.12-pre3の時点では、ファンクションの常時実行を解除するコマンドが無いようです… 誰かファンクションファイルを削除する以外の解除方法を教えて頂けないでしょうか。


いかがでしたでしょうか。急ぎ足の解説となってしまいましたが、functionシステムを活用すればコマンドブロックの数を大きく削減できることがお分かりになったと思います。しかしfunctionシステムはコマンドブロックの上位互換というわけではありません。(大事なことなので二回言いました) それぞれの長所短所を理解して、うまく使い分けましょう。