#2 関数(Function) - 意外と簡単データパック制作

こんにちは(こんばんは)Shizukuです。
今回はデータパックで最もよく使われる関数について、書いていこうかと思います。


前回 - #1 基礎 - 意外と簡単データパック制作


事前準備 - (※=必要なもの, *=あるといいもの)

※ Minecraft JAVA Edition
(統合版ではデータパックを使うことはできません)
* テキストエディタ
(VScodeなどがおすすめですが、サクラエディタなどでも可能です。
ぶっちゃけメモ帳でも)


今回使用するフォルダ

① : pack/data/minecraft/tags/functions/
② : pack/data/test/function/
この二つのフォルダを使用します。
今回は①と②という仮の名前で説明を進めます。


tick.json、load.jsonを作る(関数指定)

①の中に tick.jsonとload.jsonを作成します。テキストファイルです。
tick.jsonは1tick毎に実行する関数を指定するものです。
load.jsonは再読み込み時などに実行する関数を指定するものです。
両方とも下のようなコードになります

{
     "values":[
          "test:main"
     ]
}

「test:main」という部分は実行する関数です。
今回はtick.jsonでtestの中のmainを実行させたいというのと、load.jsonでtestの中のloadを実行させたいので、tick.jsonは上のコードになりload.jsonは下のようになります。

{
     "values":[
          "test:load"
     ]
}

余談ですが複数実行する場合は

{
     "values":[
          "test:main",
          "minecraft:main"
     ]
}

のように「,」(半角カンマ)で追加することができます。


関数作成

関数には実行させたいコマンドを書きます。
どういうことかというと、例えば「ゾンビを3匹召喚する」というfunctionを作りたい場合
(ファイル名.拡張子は[summon_zombie.mcfunction]です)

summon minecraft:zombie
summon minecraft:zombie
summon minecraft:zombie

となります。
実行する場合は

/function test:summon_zombie

です。
この場合の大きなメリットは、コマンドブロックで実行する場合、たくさんのコマンドブロックを使用しないことです。
今回は3匹なため、「コマンドブロックでもいいか」となるかもしれませんが、数が50匹、100匹などとなるとゲーム内の場所を取るコマンドブロックよりも圧倒的に1コマンドで済ませることのできる関数の方が便利です。

関数を使うにあたって意識してほしいのが

  • 上から順に実行される

  • スラッシュ(/)を含む場合はファイル自体が読み込まれない

  • シャープ(#)を1文字目に含むとその行はメモになる

  • 全て1ティック(1tick=50ms)以内で実行される

  • 実行してエラーが出ても表示されない

という点です。
メモの使い方は、例えばですが

#ゾンビ3匹をzombie1, zombie2, zombie3 という別々のタグをつけてx:0 y:60 z:0に召喚するサンプル

#ゾンビ1
summon minecraftzombie 0 60 0 {Tags:["zombie1"]}
#ゾンビ2
summon minecraftzombie 0 60 0 {Tags:["zombie2"]}
#ゾンビ3
summon minecraftzombie 0 60 0 {Tags:["zombie3"]}

このように使用します。
この#を使用したメモですが、プログラミングにおいてメモはとても重要で、これからプログラミングをやろうと思っている人は癖をつけるといいですよ。


main.json、load.jsonの使い方

関数を指定する場所(valuesの中)に実行する関数を入れると動きます。
説明した通り、main.jsonで下記のような関数を指定した場合、0.05秒に1回、自分の頭上10mから卵が降ってきます。

execute at @a run summon minecraft:egg ~ ~10 ~

主な使い道としてはmain.jsonに指定するものは常時実行して作る主なデータパックの要を担うことが多いです。
load.jsonは再読み込み(/reload)をした時にデータパックを読み込めたことを知らせたいのでチャットに「読み込めました」と言うだけの関数を指定することが多いです。


関数が読み込まれない場合

チャット欄のコマンドで/function と入力して作った関数が出てこない場合はそのファイルに問題があることが多いです。
次の点を注意して見てみてください

  • 拡張子が.mcfunctionになっているか

  • ファイル内部に架空のコマンドを書いていないか

  • シャープ(#)をつけずにメモをしていないか

この点さえ気をつければ大体は読み込まれます。
架空のコマンドというのは

summon minecraft:zombie ~ ~ ^

というのも含まれます(^がエラーを起こしている。)
この場合、どこがエラーかを教えてくれないため、気をつけましょう。


最後に

参考になりましたでしょうか?
functionは多くのデータパックの要となるので理解しておくと超便利です。
配布マップ制作などでも重宝します。

これでわざわざ指定座標にレッドストーンブロックを置いて複数のコマンドを実行する…なんてことが大幅になくなります。

ただコマンドブロックにもコマンドブロックしかできないことがあるので併用していくことが大切だと私は思います。

次回 - 実践 - 予定

この記事が気に入ったらサポートをしてみませんか?