
function環境構築
こんにちは。
最近データパックの素晴らしさに気付いたささすけです。
今回はデータパックの中でも主要な要素である「function」について紹介します。functionを使いこなせば、ワールド内に設置されている(読みにくく改修しにくい)大量のコマンドブロックを全てテキストファイルとして一括で管理できるようになります。それだけでなく、データパックフォルダをまるっとコピペするだけで、別ワールドにコマンド一式を一瞬で移行できるようになります。
functionコマンドの素晴らしさは記事がもう一本かけるくらいあるので、今回は「どうやってfunctionコマンドを使うの?」という内容に絞って紹介していきます。
function導入方法
1.functionを実行したいワールドの編集画面を開く
minecraftを起動し、ワールド選択画面からfunctionコマンドを実行したいワールドの「編集」を選択します。

2.ワールドフォルダを開く
「ワールドフォルダーを開く」を選択します。

3.データパックフォルダを開く
「C:\Users\ユーザー名\AppData\Roaming.minecraft\saves\ワールド名」が開かれた状態でエクスプローラーが起動したら、「datapacks」フォルダを開きます。これは、データパックを作成する際に使用するファイルを入れるフォルダとなります。
特に変更していなければこのフォルダ内は空です。

4.自作データパックフォルダを作成する
「datapacks」フォルダ内に、好きな名前のフォルダを新規作成します。この名前はデータパックの名前となるので、何のデータパックかが分かる名前にすると良いです。特に他人に公開する予定が無ければ、自分が分かる名前でOKです。
今回は「sample_datapack」としました。

5.データパックの設定ファイル作成
データパックを認識させるために、4.で作成した「sample_datapack」フォルダ内に「pack.mcmeta」ファイルを作成します。(スペルミスに注意!)

作成した「pack.mcmeta」ファイルには、下記内容を記載します。(コピペ推奨)
(参考サイト:https://minecraft.fandom.com/ja/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%91%E3%83%83%E3%82%AF)
{
"pack": {
"pack_format": 26,
"description": "データパックの説明"
}
}
「pack_format」には参考サイト内の下記表から、minecraftのワールドのバージョンに対応する値を入力します。
今回はバージョン1.20.4のため「26」としていますが、別のバージョンを使用する場合は参考サイト等を使って調べてみてください。

ワールドのバージョンはワールドの起動画面から確認できます。

「description」には、適当な説明文を入れてください。こちらも、他人に公開する予定が無ければ適当で大丈夫です。
6.function用フォルダの作成
続いて、4.で作成した「sample_datapack」フォルダ内に、「data」フォルダを作成します。

作成した「data」フォルダ内に、好きな名前のフォルダを作成します。

ここで作成したフォルダ名は、ゲーム内でfunctionコマンドを使用する際に記載する内容になるので、分かりやすい名前を付けてください。(手順7.まで進めると下画像のように表示されます)

マルチで使用するワールドの場合、このフォルダ名をプレイヤー名にすると誰が作ったfunctionなのかが一発で分かるのでおススメです。今回は筆者のプレイヤー名である「ssss3」をフォルダ名としました。
「ssss3」フォルダ内に「functions」フォルダを作成します。(スペルミスに注意!)
このフォルダ内に、functionコマンドで呼び出すファイルを作っていくことになります。

7.function実行用ファイルの作成
作成した「functions」フォルダ内に、拡張子が「.mcfunction」となるファイルを作成する。(スペルミスに注意!)
今回は「test.mcfunction」としました。

ここで作成したファイル名は、ゲーム内でfunctionコマンドを使用する際に記載する内容になります。

functionコマンドを実行する際に、「このコマンドはこんな処理ですよ」というのが分かる名前にすると良いです。
例1:ホゲホゲミニゲームを開始する処理の場合→「start_hogehoge_game.mcfunction」
例2:最強のゾンビを召喚する処理の場合→「summon_strongest_zombie.mcfunction」
手順1.のワールドに入り、「/function 」と入力すると、作成したファイルが候補として表示されます。これで、ようやくfunctionコマンドを実行する準備が整いました。
※以下のように、作成したファイルが表示されないよ!という場合は、「/reload」コマンドを実行してから、再度「/function 」を入力してみてください。「/reload」コマンドは、データパックの読み込みを更新するコマンドです。手順4.で作成したデータパックフォルダ内の内容を編集したら、変更を反映させるために毎回このコマンドを実行してから「function」コマンドを実行してください。

※「/reload」を実行しても状況が改善しない場合、これまでの手順のどこかを間違っている可能性があります。フォルダ名やファイルの拡張子、「pack.mcmeta」ファイル内の内容など、スペルミスをしていないか確認してください。
また、バージョンアップの影響で手順が変わっている可能性もあります。本記事ではバージョン1.20.4を対象としています。異なるバージョンを使用したい場合はバージョン名も込みで検索してみると対応策が見つかるかもしれません。
fuctionの仕様紹介
ここからは、functionコマンドを使用する上で最低限知っておくべき仕様を紹介します。
実行順の確認
「.mcfunction」ファイル内に書いたコマンドをfunctionコマンドで実行してみる
手順7.で作成した「test.mcfunction」の中に、以下の内容を記載します。
「.mcfunction」ファイル内に記載するコマンドは、文頭に「/」を入れないでください。
say test1
say test2
say test3
コマンドが記載できたら、ゲーム内で「/reload」コマンドしてから、「/function ssss3:test」をゲーム内で実行します。
以下のように実行されれば成功です。

このように、「.mcfunction」ファイル内に書いたコマンドは上から1行ずつ順番に実行されます。
実行者と実行地点の確認
続いて、「test.mcfunction」の記載内容を以下の内容に変更します。
# 実行者が「hello!」とチャットメッセージを送る
say hello!
# 実行地点の2マス上にダイヤモンドブロックを設置する
setblock ~ ~2 ~ minecraft:diamond_block
上記のように文頭に「#」を入力すると、その行はコメントアウトされ、コマンドの実行に影響を及ぼさなくなります。どんな内容の処理なのかをコメントに記載しておくと、処理を追いやすくなるのでこまめにコメントを記載することをお勧めします。
コマンドが記載できたら、ゲーム内で「/reload」コマンドしてから、下記コマンドを実行します。
「/execute as @e[type=!minecraft:player,distance=..10] at @s run function ssss3:test」
このコマンドは、「プレイヤーから距離10マス以内にいるエンティティがfunctionコマンドを実行する」コマンドです。
実行後、下画像のようになれば成功です。

このように、「.mcfunction」ファイル内に書いたコマンドの実行者と実行地点は、functionコマンドの実行者と実行地点と同じになります。
functionからfunctionを呼び出す
続いて、「test.mcfunction」の記載内容を以下の内容に変更します。
# 実行者が「test」とチャットメッセージを送る
say test
# test2フォルダ内の「test2.mcfunction」を呼び出す
function ssss3:test2/test2
手順6.で作成した「functions」フォルダ内に「test2」フォルダを作成し、その中に「test2.mcfunction」を作成します。

このように、「functions」フォルダ内に適当なフォルダ階層を作成しても、その中の「.mcfunction」ファイルは全てfunctionコマンドで実行できます。プロジェクトの規模が小さければ特に階層を分ける必要はないですが、数10~数100以上の「.mcfunction」ファイルを使用するような中~大規模なプロジェクトを作成する場合は、機能のまとまりごとにフォルダを分けておくと読みやすくなります。
作成した「test2.mcfunction」ファイル内に以下の内容を記載します
# 実行者が「test2」とチャットメッセージを送る
say test2
コマンドが記載できたら、ゲーム内で「/reload」コマンドしてから、「/function ssss3:test」をゲーム内で実行します。
以下のように実行されれば成功です。

この結果から、「.mcfunction」内のコマンドで別のfunctionを実行できることが分かります。一つの「.mcfunction」内のコマンドの行数が多くなりすぎると読みにくく管理しにくくなるので、機能のまとまりごとにファイルを分割すると良いです。
引数を渡して呼び出す
続いて、「test.mcfunction」の記載内容を以下の内容に変更します。
# 実行者が、引数に渡したメッセージをチャットに送る
$say $(message)
コマンドが記載できたら、ゲーム内で「/reload」コマンドしてから、「/function ssss3:test {message:"hogehoge"}」をゲーム内で実行します。

このように、functionコマンドを実行するときに引数としてデータを渡すと、「.mcfunction」内で渡された値を使用できるようになります。
引数の値を使用するには、使用したい行の文頭に「$」を入力します。
今回はキーとして「message」、値として「"hogehoge"」を引数として渡しています。
キーの名前は自由に決められるので、用途に合わせた名前を付けて分かりやすくすることをお勧めします。
値は文字列と数値を渡すことが出来ます。
さらに、引数は複数渡すことができます。
それだけでなく、以下のようにブロックやエンティティのnbt、data storageの中身のデータも渡すことが出来ます。

実はこれ、マイクラのコマンドの歴史を変えるほどすごい機能だと個人的に思っているのですが、このすごさを語るには記事の長さがもう2~3倍くらいになりそうなので今回は割愛します。
あとがき
以上が、functionコマンドを実行するための手順の紹介となります。
今回紹介した内容に加えて「advancement」や「predicate」と組み合わせることで、出来ることが飛躍的に増えます。これらについても今後記事として書いていきたいと思います。