見出し画像

マイクラPE版・JE版でのmcfunction(関数)の違い

マイクラではコマンドを関数化できます。

つまりmcfunctionが使えます。

そのPE版とJE版の違いについて

  • PE版 - ポケットエディション。統合版とも

  • JE版 - Javaエディション。主にPC向け

これを深く調べていくと次の違いがありました。

もちろんPE・JEでコマンド構文も違うけど、
それは当たり前なので違いには含めないことにします。

フワッとした全体的な違いです。

1.mcfunctionの配置場所が違う

これが全然違いました。

まずmcfunctionは次の場面だけで使えます。

  • PE版 - ビヘイビアーパックの中のみ

  • JE版 - データパックの中のみ

つまり PE版ビヘイビアーパック = JE版データパック

ビヘイビアーパック・データパックはzip形式のデータであり、その中に functions ディレクトリを作って .mcfunction 形式の関数を配置できます。

問題はその配置場所の違いです。

  • PE版 - ポケットエディションの場合
    ビヘイビアーパック直下の /functions の中に .mcfunction を必要なだけ用意すればいい。サブフォルダも可

  • JE版 - JAVAエディションの場合
    データパックの中の /[データパック名]/data/functions の中に .mcfunction を必要なだけ作成できる。サブフォルダも可

詳しくは次のマイクラWIKIとか参照

▼ PE版での関数(Bedrock Edition)

▼ JE版での関数(Java Edition)

大前提としてmcfunctionは単体では実行できません。
ビヘイビアーパック・データパックの中でのみ実行可能です。

意味が分からない場合はWIKIを読むべきです。

2.関数呼び出しに名前空間が必要かどうか

こういう違いもある

  • JE版 - 名前空間がないと関数実行ができない

  • PE版 - そもそも名前空間という概念がない

例えばJE版では次の場所に .mcfunction を作ります。

▼ JE版でのデータパック内の .mcfunction の例

/[データパック名]/data/functions/hoge.mcfunction

▼ hoge.mcfunctionを呼び出す時は名前空間必要

/function [データパック名]:hoge

これがPE版にないところです。

そもそもPE版だと名前空間という概念もないし、
functionsディレクトリの中の関数を直接名前で呼び出せます。

▼ PE版でのビヘイビアーパック内での .mcfunction の例

/functions/hoge.mcfunction

▼ そのまま関数名だけで実行できる(マイクラ内)

/function hoge

だからPE版だとビヘイビアーパック間で関数名が衝突する、
そういったリスクもあると考えられます。

関数名が衝突したときに何が起こるのか……

それは検証してないので分かりません。今度検証してみたい

その点、JE版では関数名衝突を考えなくていいから安全。
JE版は名前空間の導入でそういう問題を回避している模様です。

3.PEは構文ミスに寛容、JEはとても厳格

これもPE・JE 両方触ってみて気づいたこと

コマンド・構文に対する厳密さが違います。

▼ 例えばmcfunction内に次のコマンドがあるとする

setblock ~ ~   ~ minecraft:stone

コマンド例では ~ ~ と ~ の間に空白が3つあります。
これはPE版では問題なく実行できます。

でもJE版ではなぜか実行できませんでした。

それはJE版では次の厳密なコマンド構文チェックがあるため

  • 2つ以上の空白スペースを許容しない

  • 行頭/行末のスペースも許容しない

  • PE版と比べてメチャクチャ厳格

この点は次のnoteでも書いたことです。

Java版は空白スペースに対しても厳密に判定します。

もしデータパックで関数が認識されないなら、
空白・スペースに問題がないか確認してみるといいかも

4.PEでは最大10000コマンド、JEでは無制限

あとmcfunctionには最大実行コマンドに制限があります。

PE版では一度に10000コマンドまで実行可能

▼ その根拠というかソース

関数は、他の関数内で呼び出された入れ子関数のコマンドを含め、すべてのコマンドを単一のティック内で実行する。1度の関数の実行では、他の関数の呼び出し、つまり再帰を含め最大10000個までのコマンドが実行される。

https://minecraft.fandom.com/ja/wiki/%E9%96%A2%E6%95%B0_(Bedrock_Edition)

再帰を含めて最大10000個までのコマンド

例えば hoge.mcfunction があって、その中で fuga.mcfunction を呼び出ししたとしても、全体で呼び出せるコマンド数は10000個までってことです。

だからPE版ではどう頑張っても1度に1万個までしか実行できません。

一方のJava版だと最大コマンド数に制限なし

試しに適当なデータパックを作り、
その中で20000個以上のコマンドを書いてみました。

そしてマイクラ内で実行しても漏れなく実行できました。

恐らくJE版では実質的な最大コマンド数に制限ありません。


目立った違いはこれくらいかという感じ

もし他にあるならこっそり教えてください。

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