関数 (Java Edition)

提供: Minecraft Wiki
移動先: 案内検索
Information icon.svg
この項目はJava Edition限定の要素です。

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

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

関数を使用するには、まず、関数のファイルとするテキストファイルを、関数ファイルにおける最上位フォルダとなる [ワールド名]/datapacks/[データパック名]/data/functions フォルダ内に配置する必要がある[1]。この functions 最上位フォルダの下位の階層構造の名前は、このフォルダ内の関数を実行するときに使用される名前空間となる。関数は、最上位フォルダ下位のフォルダの、更に下位となるサブフォルダに配置することもできる。

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

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

/functionによって関数を実行した場合、チャット関数「[関数ファイルのディレクトリ]」からコマンドを [数] つ実行しましたというメッセージが表示される。埋め込み関数の場合はチャットメッセージは表示されない。関数内のコマンドの成功数をコンパレーターで測定することはできないが、/execute storeコマンドを使用すれば成功数を測定すること自体は可能である。

コマンドブロックのように、オペレーター権限の範囲内であれば関数は任意のコマンドを実行できる。コマンドブロックで実行できないコマンドは実行できない。

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

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

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

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

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

関数はまた、すべてのコマンドを1回のティックで実行する。他の関数の中から呼び出された関数は、親と同じティックでコマンドを実行する。関数内のコマンドは、関数の呼び出された環境(コマンド実行者、座標、方角、など)に基づいてコマンドを実行する。

関数内でのコマンド実行環境は、コマンドの順序に関係なく次の繰り返しまでその関数(または関数内で呼び出される他の関数)内で変化しない。例外として、/executeコマンドで関数を呼び出すことによりコマンド実行環境を変更できる。

例えば、

execute as @a at @s run function foo:bar

foo:bar

teleport @s ~ ~5 ~
setblock ~ ~-1 ~ emerald_block
execute at @s run setblock ~ ~-1 ~ diamond_block

これはプレイヤーを5ブロック上にテレポートさせ、エメラルドブロックをテレポートの足下座標に設置し、ダイヤモンドブロックをテレポートの足下座標に設置する関数である。この振る舞いはターゲットセレクター引数には影響しない。

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

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

/function
  • 1つの関数、または、1つの関数タグに紐付く全ての関数を実行できる。
  • /functionコマンドが実行されたコマンド実行環境に基づいて関数を実行する。
  • コマンド実行環境は/executeコマンドによって変更できる。
  • 使用法: /function <名前空間:ファイルパス>

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

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

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

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

タグ[編集 | ソースを編集]

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

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

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

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

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

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

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