functionコマンド

スポンサーリンク

function とは

function は日本語で「関数」と訳され、マイクラにおいては複数のコマンドを一つにまとめて実行できるものになります。functionを使用することによる主なメリットとして、

  • コマンドブロックを大量に使わずに済む
  • 他のワールドでも使いまわしできる
  • テキストエディタで編集できるためコマンドが書きやすい

などがあります。とくに何百ものコマンドを実行したい場合は便利な機能となります。

functionの使い方

functionを使用する場合、まずビヘイビアパックを用意する必要があります。ビヘイビアパックの作成方法はこちら(リンク)をご確認ください。

ビヘイビアパックを用意したらmanifest.jsonと同じ階層に「functions」というディレクトリを作成してください。functionファイルはその中に追加していきます。

ここでは例として「test」というfunctionを作成してみましょう。まず、test.mcfunctionというテキストファイルをfunctionsディレクトリ内で作成します(拡張子が変更できない場合はエクスプローラーの設定を変更する必要があります)。作成したらtest.mcfunctionをメモ帳などのテキストエディターで開き以下の内容を記述しましょう。

say functionテスト!
say 複数のコマンドをまとめて実行できる!
playsound random.levelup @a 
#コメントもできる

上記のように、一行ごとにコマンドを記述することになります(スラッシュは不要)。また4行目のように最初に#をつけることで、コメント(メモ)をつけることができます。functionが長くなる場合は適宜コメントをつけておくことで、後で見返したときにコマンドの処理を思い出しやすくなります。記述したらファイルを保存して、作成したアドオンを導入したワールドを開き、以下のコマンドを実行してみましょう。

/function test

/function <ファイル名>という形式になります。実行すると、うまくいっていれば「functionテスト!」「複数のコマンドをまとめて実行できる!」のメッセージとともにレベルアップの効果音が流れます。実行時のメッセージの表示順からわかるように、コマンドは上の行から順に実行されます。またすべてのコマンドは同じtickで実行されます。

コマンド実行が失敗する場合は、アドオンが読み込めているか、アドオンのディレクトリ構造に間違いがないかなどをご確認ください。

/reloadによる更新

ほかにもfunctionを作ってみましょう。今度はtest2.mcfunctionを作成し、以下のコマンドを記述してみます。

say 二つ目のfunction!
say functionコマンドも実行できる!
function test

今度は「function test2」とすればfunctionが実行されるはずですが、ワールドを開いたままfunctionファイルの編集を行っていた場合、test2.mcfunctionが保存されていてもfunctionコマンドは失敗します。これはワールドを開いている状態では、アドオンファイルの中身を書きえても反映されないためです。ワールドを閉じて再度開いたり、マイクラ自体を再起動させればアドオンは更新されますが、functionは特別なコマンド「/reload」を実行することでワールドを開きなおさずともファイルの更新を行ってくれます。

/reload

reloadコマンドを実行したのちにfunctionを実行すると問題なくfunctionが実行されます。

/function test2

なお、test2の具体例にもあるように、functionはほかのfunctionを実行することもできます。

(応用)再帰処理によるループ実行

reloadの項でfuncitonコマンドはfunctionコマンドを実行することができる記載しましたが、これは自身のfunctionも例外ではありません。例えばloop.mcfunctionファイルを作成し、以下のようなコマンドを書いたとします。

say ループ中!
function loop

このfunctionでは、2行目のところで自身のfunctionを再度呼び出しています。しかし、このfunctionをワールド内で実行するのは危険です。実際にワールド内で実行すると、loopファンクションによってloopファンクションが実行され、そのloopファンクションによってまたloopファンクションが実行され...という風に無限ループしてしまいます。

実際にはfunctionは1tick中に実行できるコマンド数に制限(デフォルト10000、/gameruleで変更可能)があるため無限に実行することはないのですが、かなりゲームが重たくなります。

実用的にこのループ処理を活用したい場合は、scoreboardなどと組み合わせて条件を満たしている場合にのみ自身を呼び出すという処理をする必要があります。例えば以下のように書き換えます。

say ループ中!
scoreboard players add @p count 1
execute as @p if score @s count matches ..9 run function loop
scoreboard players set @p count 0

countというscoreboardがある前提で、実行するごとにcountを1ずつ増やしています。またfunctionを実行する前に、countの値が9以下である場合という条件を追加しています。countのscoreboardを追加したのちにこのコマンドを実行してみると、ループ中!のメッセージが10回までしか出てきません。これは、function実行ごとにcountに1が追加され、countが10になるとexecuteコマンドの条件を満たさなくなりループが終了するからです。

このように、条件を追加することでループ処理を行うことができます。例えば同じコマンドを同一tickで100回処理したい場合、コマンドブロックであれば100個のコマンドブロックを用意する必要がありますが、functionを活用することでその手間を減らすことも可能です。しかし、一歩間違えると無限ループしてしまうこともあるので、使う際は注意する必要があります。

(おまけ)VSCodeの拡張機能について(windows)

Visual Studio Code (VSCode)とはMicrosoftが開発しているプログラミング向けのテキストエディターです。.mcfunctionファイルはメモ帳などでも編集することができますが、今後大量のfunctionやそのほかアドオンを開発する場合は、より便利であるVSCodeによる開発をお勧めします。
VSCodeをインストール

VSCodeには拡張機能を導入することができ、有志により開発されたminecraft用の拡張機能が存在します。その中でも「Blockception’s Minecraft Bedrock Development」は.mcfunctionファイルのハイライト機能がサポートされています。

コメント

コメント通報