関数

提供: Minecraft Wiki
移動先: 案内検索
Java Edition.png

Java Edition 限定

関数(英: Function、ファンクション)は、拡張子 .mcfunction のテキストファイルを使用することで、プレイヤーが簡単にコマンドのリストをスクリプト化して実行できる機能である。問題点を回避するために、関数ファイルに UTF-8(BOM なし)をエンコーディングすることを推奨する。

使用法[編集 | ソースを編集]

関数を使用するには、まず、関数のファイルとするテキストファイルを、関数ファイルにおける最上位フォルダとなる [ワールド名]/data/functions[1.13 まで] フォルダ内に配置する必要がある。シングルプレイの場合、ワールドのフォルダの位置は .minecraft/saves/[ワールド名] となる。マルチプレイの場合、それを使用した全てのワールドのフォルダに関数を配置する必要がある。 この functions 最上位フォルダの下位の階層構造の名前は、このフォルダ内の関数を実行するときに使用される名前空間となる。関数は、最上位フォルダ下位のフォルダの、更に下位となるサブフォルダに配置することもできる。

たとえば、関数 custom:example/test を実行すると、functions/custom/example/test.mcfunction フォルダ内の関数が参照される。名前空間を省略して関数を実行すると、自動的にデフォルトの minecraft: の名前空間となる。今後の、デフォルトの minecraft: の名前空間への要素の追加時に意図しない振る舞いを防ぐために、オリジナルの名前空間の使用を推奨する[1]

テキストファイルの文字列である関数は、容易に変更可能であり、また、大量に使用されたとしても遅延を誘発する可能性はコマンドブロックよりも低い。関数が変更または追加された場合、そのままではその変化が反映されないが、 /reload コマンドを使用することで記憶領域から関数ファイルが再読み込みされ、変化が反映される。これにより、Minecraftのゲームを再起動する必要なく、関数ファイルの変更を認識することができる。

関数が正常に実行されると、チャットに関数「[関数ファイルのディレクトリ]」からコマンドを [数] つ実行しましたというメッセージが表示される。関数の正常な出力は(複雑なスコアボードコマンドを使用せずに)コンパレーターでは測定できず、関数には「条件付き」引数が存在しない。

関数ファイルの構文規則[編集 | ソースを編集]

関数のシステムのテスト。 3つの /tellraw メッセージと1つの /give コマンドがこのシンプルな関数で使用された。

.mcfunction 関数ファイル内では、通常のスラッシュ (/) を使用せずに1行に1つの有効なコマンドが配置される。プレイヤーは、関数テキストファイル内で # を付けてコメントを追加することができる。

関数内の個々のコマンドは、コマンドブロックでの32500文字の文字制限より長く記述することができる。関数内で実行されるコマンドの総数は、/gamerule maxCommandChainLength に従う。これは、デフォルトで65536個である。この制限を超えるコマンドは関数から無視される。

関数の実行[編集 | ソースを編集]

関数はまた、すべてのコマンドを1回のティックで実行する。他の関数の中から呼び出された関数は、親と同じティックでコマンドを実行する。

関数内で起こる位置の変化は、コマンドの順序に関係なく次の繰り返しまでその関数(または関数内で呼び出される他の関数)内の他のコマンドで使用される相対座標には影響しない。/execute コマンドでこれを回避することができる。

例えば、

tp @a ~ ~5 ~
setblock ~ ~-1 ~ emerald_block
execute @a ~ ~ ~ setblock ~ ~-1 ~ diamond_block

注意 - 3行目の構文は、1.13 のスナップショットの Data pack で使用されると、無効になる。

のこれらの3つのコマンドは、5ブロック上のすべてのプレイヤーをテレポートし、エメラルドブロックへのテレポートのの元の位置よりも1ブロック下にあり、テレポートの新しい位置よりも1ブロック低い位置にダイヤモンドブロックを設置する。この動作は、セレクター内の位置引数には影響しない。セレクターは、実行時に常に現在の位置をテストする。

現在、ゲーム内で関数ファイルを実行する方法はいくつか存在する。

コマンド[編集 | ソースを編集]

/function
  • プレイヤーが一回関数を実行することができるようになる。
  • 関数内のコマンドは、/function コマンドを実行したエンティティまたはコマンドブロックを介して実行される
  • オプションの引数 ifunless は、selector が見つかったとき、またはワールドに見つからなかったときにのみ関数を実行する。
  • 使用法: /function <namespace:path/to/function/file> [if|unless] [対象]
/gamerule gameLoopFunction[1.13 まで]
  • ティック毎に関数を実行するようになる。
  • 関数内のコマンドは、サーバーを介して実行される。
    • 「サーバー」がコマンドを実行する座標は (0, 0, 0) である
  • 複数の関数をループさせる必要がある場合、そのループ関数ファイルにfunctionコマンドを挿入したり、その関数に function コマンドを挿入することができる。
  • 使用法: /gamerule gameLoopFunction <namespace:path/to/function/file>
  • /gamerule gameLoopF​​unction - などの存在しない値を代入して実行することで、ループを止めることができる

進捗[編集 | ソースを編集]

進捗は、それらを達成するための報酬として一度関数を実行することができる。関数のコマンドは、進捗を達成したプレイヤーを介して実行される。

報酬の関数は、次の形式を使用して進捗のJSONファイルから使用することができる。

{
    "rewards": {
        "function": "namespace:path/to/function/file"
    }
}

Tag‌[1.13 で開発中] [編集 | ソースを編集]

Data pack 内の Tag を使用することで、関数をグループ化することができる。これらの Tag は、/function #(名前空間):tag で Tag 内のすべての関数を実行するために呼び出すことができる。

minecraft:tick でタグ付けされた関数は、ティックごとに関数を実行するようになり、minecraft:load でタグ付けされた関数は、読み込まれた時(もしくは再読み込みされた時)に一度関数を実行するようになる。

歴史[編集 | ソースを編集]

Java Edition
1.12 1.12-pre1 関数が追加された。
1.12-pre3 コマンドが /(スラッシュ)から始められなくなった。
コメントの前には # しか付けられなくなり、// が使えなくなった。
1.12-pre4 /function コマンドに新しい引数が追加された: [if|unless] [対象]
1.12-pre6 スキップされた関数(条件が失敗した場合)がコマンドで使用されると、失敗と見なされるようになった。
開発中の Java Edition
1.13 17w43a オリジナルの関数が Data pack へ移動された。
17w45a 関数を高速かつ効率的に使用できるようになった。
17w49b 関数を Tag でタグ付けできるようになった。
minecraft:tick でタグ付けされた関数が、ティックごとに関数を実行するようになった。

問題点[編集 | ソースを編集]

「Function」に関する問題点は、バグトラッカーにて管理されている。問題点の報告はそちらで行ってほしい。

脚注[編集 | ソースを編集]