【マイクラ】predicateとは?execute if predicate・条件判定での使い方【Java版】

Java版のデータパック・コマンド向け記事です
統合版(BE)では同じ仕様では使えません
predicateは“条件判定をJSON化する仕組み”として覚えると分かりやすいです

こんにちは。ゆずかきです。

マイクラJava版でデータパックやコマンドを触っていると、たまに predicate(プレディケート) という言葉が出てきます。

最初に見ると、正直ちょっと難しそうですよね。
execute if predicateとか、predicatesフォルダとか、JSONとか…。

ただ、使いどころを一言で言うと、predicateは「条件を1つのファイルにまとめて、コマンドやデータパックから呼び出す仕組み」です。

たとえば、

  • 雨が降っている時だけコマンドを実行する
  • プレイヤーが特定バイオームにいる時だけ処理する
  • しゃがみ中のプレイヤーだけを判定する
  • 複数条件をall_ofany_ofでまとめる

こういう条件分岐を、コマンド内にベタ書きしすぎず整理できるのが強みです。

この記事では、マイクラJava版のpredicateとは何か、execute if predicateでどう使うのかを、実際に使う形で順番に解説していきますね。

この記事を読めば、次のことが出来るようになります。

  • predicateの役割が分かります👌
  • execute if predicateで条件判定できるようになります👍
  • all_ofany_ofinvertedの使い分けが分かります
  • 失敗しやすいpredicateの文脈ミスを避けられます

それでは、やっていきましょう!

※本記事はマイクラJava版のデータパック・コマンド向けです。
※ゲーム内の仕様については、公式リリースノートおよびコミュニティWikiを参考にしています。
※predicateのJSON形式はバージョン更新で変わることがあるため、実装時は使用中のJava版で/reload後にエラーが出ないか確認してください。


目次

1. predicateとは?マイクラの条件判定ファイルです
2. predicateはどこに置く?フォルダ構成を確認
3. まずは雨判定のpredicateを作ってみる
4. execute if predicateで条件が真の時だけ実行する
5. バイオーム判定に使うlocation_check
6. プレイヤーのしゃがみ判定に使うentity_properties
7. all_of・any_of・invertedで複数条件を組む
8. target selectorのpredicate=で対象を絞る
9. execute if predicateで失敗しやすい条件タイプ
10. Java版1.21.11以降で気を付けたい変更点
11. よく使うpredicate条件タイプ早見表
12. predicateが動かない時のチェックポイント
13. まとめ
14. 参考文献

この記事で分かること
・マイクラJava版のpredicateの基本
execute if predicateの使い方
・データパックで条件判定を整理する考え方
・1.21.11以降でも注意したい仕様変更ポイント


1. predicateとは?マイクラの条件判定ファイルです

predicateとは、マイクラJava版のデータパックで使える条件判定用のJSONです。

日本語で言うなら、「この条件を満たしているか?」を判定するファイルですね。

たとえば、

execute if predicate yuzukaki:is_raining run say 雨が降っています

このコマンドは、yuzukaki:is_rainingというpredicateが成功した時だけ、sayを実行します。

predicateの中身は、こんな感じです。

{
  "condition": "minecraft:weather_check",
  "raining": true
}

👆これは、雨が降っているかどうかを判定するpredicateです。

普通にコマンドだけで書くと長くなりがちな条件を、predicateファイルに分けておくことで、後から見返した時にかなり分かりやすくなります。

体験ベースでの印象
predicateは、最初は「JSONが増えて面倒そう」に見えます。
でも、条件が2個・3個と増えたあたりから、コマンドに直接書くより管理しやすくなります。

特に、データパックでゲームシステムを作る時は、

  • プレイヤーの状態を判定する
  • 天候や時間を判定する
  • 場所やバイオームを判定する
  • 複数条件をまとめて呼び出す

こういう場面が多いので、predicateを覚えておくと便利です。


2. predicateはどこに置く?フォルダ構成を確認

predicateファイルは、データパック内のpredicatesフォルダに入れます。

基本の置き場所は、次の通りです。

データパック名/
├─ pack.mcmeta
└─ data/
   └─ yuzukaki/
      ├─ functions/
      └─ predicates/
         └─ is_raining.json

この場合、コマンドから呼び出す名前はこうなります。

yuzukaki:is_raining

data/yuzukaki/predicates/is_raining.json
yuzukaki:is_raining

という対応ですね。

サブフォルダを作った場合は、呼び出し名にもそのフォルダ名が入ります。

data/yuzukaki/predicates/player/is_sneaking.json

この場合は、

yuzukaki:player/is_sneaking

として呼び出します。

ここで初心者さんがよく間違えるのが、.jsonまで付けて呼び出してしまうことです。

# NG例
execute if predicate yuzukaki:is_raining.json run say test

これは違います。

# OK例
execute if predicate yuzukaki:is_raining run say test

拡張子は付けず、namespace:pathの形で呼び出しましょう。

pack.mcmetaのデータパック形式は、使用しているJava版によって変わります。特にJava版1.21.9以降はパック形式にマイナーバージョンが入り、min_formatmax_formatで対応範囲を指定する形になっています。1.21.11や26.1などではデータパック形式も変わっているため、ここは自分の導入バージョンに合わせてくださいね。


3. まずは雨判定のpredicateを作ってみる

最初に作るなら、雨判定のpredicateが分かりやすいです。

data/yuzukaki/predicates/is_raining.jsonを作って、次のように書きます。

{
  "condition": "minecraft:weather_check",
  "raining": true
}

これで、現在の天候が雨または雷雨なら成功するpredicateになります。

雷雨だけを判定したい場合は、thunderingを使います。

{
  "condition": "minecraft:weather_check",
  "thundering": true
}

雨でも雷雨でもなく、晴れている時だけ判定したい場合は、後で紹介するinvertedを使うと分かりやすいです。

{
  "condition": "minecraft:inverted",
  "term": {
    "condition": "minecraft:weather_check",
    "raining": true
  }
}

👆これは、雨判定を反転しているので、雨ではない時に成功します。

作成後は必ずreloadする

predicateファイルを作ったら、ゲーム内で/reloadします。

reload

エラーがある場合は、チャットログやログファイルにJSONの読み込みエラーが出ます。

よくあるミス
JSONの最後に余計なカンマを入れると読み込まれません。
マイクラのデータパックは、こういう細かいJSONミスにかなり厳しいです。

たとえばこれはNGです。

{
  "condition": "minecraft:weather_check",
  "raining": true,
}

最後の,が余計ですね。

正しくはこうです。

{
  "condition": "minecraft:weather_check",
  "raining": true
}

最初のうちは、1個作るたびに/reloadして、エラーが出ないか確認するのがおすすめです。


4. execute if predicateで条件が真の時だけ実行する

predicateを作ったら、次はexecute if predicateで呼び出します。

基本形はこれです。

execute if predicate <predicate名> run <実行したいコマンド>

雨判定なら、こうですね。

execute if predicate yuzukaki:is_raining run say 雨が降っています

雨が降っている時だけ、チャットに表示されます。

逆に、条件を満たしていない時だけ実行したい場合は、unlessを使います。

execute unless predicate yuzukaki:is_raining run say 雨は降っていません

ifunlessの違いはシンプルです。

  • if predicate:predicateが成功したら実行
  • unless predicate:predicateが失敗したら実行

この2つを使い分けるだけでも、かなり色々な条件分岐ができます。

function内で使う場合はスラッシュを付けない

データパックの.mcfunctionファイルに書く場合は、先頭の/は付けません。

execute if predicate yuzukaki:is_raining run say 雨です

コマンドブロックやチャット欄だと/executeと書く場面もありますが、function内では/なしで書きます。

ここを混同すると、データパックが読み込みエラーになるので注意してくださいね。


5. バイオーム判定に使うlocation_check

次は、predicateでよく使うバイオーム判定です。

たとえば、プレイヤーが砂漠にいる時だけ処理したい場合、location_checkを使います。

data/yuzukaki/predicates/in_desert.jsonを作ります。

{
  "condition": "minecraft:location_check",
  "predicate": {
    "biomes": "minecraft:desert"
  }
}

これで、実行位置が砂漠バイオームなら成功します。

ただし、ここで大事なのが実行位置です。

次のように書くと、プレイヤーごとの位置ではなく、コマンドを実行している位置で判定してしまうことがあります。

execute as @a if predicate yuzukaki:in_desert run say 砂漠です

プレイヤーの現在地を見たい場合は、at @sを入れてください。

execute as @a at @s if predicate yuzukaki:in_desert run tellraw @s {"text":"ここは砂漠です","color":"yellow"}

👆この形なら、各プレイヤーの位置でin_desertを判定できます。

ここ、本当に大事です
as @aは「実行者」をプレイヤーにするだけです。
位置までプレイヤーに合わせたい場合は、at @sも必要です。

バイオーム判定やブロック位置判定でpredicateを使う時は、asatの違いを意識しましょう。


6. プレイヤーのしゃがみ判定に使うentity_properties

Java版1.21.2以降では、プレイヤーの入力状態をpredicateで判定できるようになっています。

たとえば、しゃがみ中のプレイヤーだけ判定したい場合は、次のようなpredicateを作ります。

data/yuzukaki/predicates/player/is_sneaking.json

{
  "condition": "minecraft:entity_properties",
  "entity": "this",
  "predicate": {
    "type_specific": {
      "type": "minecraft:player",
      "input": {
        "sneak": true
      }
    }
  }
}

これで、thisに入っているエンティティがプレイヤーで、かつスニーク入力中なら成功します。

呼び出す時は、次のように書きます。

execute as @a if predicate yuzukaki:player/is_sneaking run tellraw @s {"text":"しゃがみ中です","color":"green"}

この例では、as @aで各プレイヤーを@sにして、そのプレイヤー自身をpredicateで判定しています。

sneak以外にも判定できる入力

プレイヤー入力のpredicateでは、次のようなキー入力を条件にできます。

  • forward:前進入力
  • backward:後退入力
  • left:左移動入力
  • right:右移動入力
  • jump:ジャンプ入力
  • sneak:スニーク入力
  • sprint:ダッシュ入力

たとえば、ジャンプ入力中だけ判定したい場合はこうです。

{
  "condition": "minecraft:entity_properties",
  "entity": "this",
  "predicate": {
    "type_specific": {
      "type": "minecraft:player",
      "input": {
        "jump": true
      }
    }
  }
}

これは、アクション系のデータパックを作る時にかなり便利です。

スコアボードだけで似た処理を作ろうとすると複雑になりがちなので、キー入力の判定はpredicateに任せるという考え方もありですね。


7. all_of・any_of・invertedで複数条件を組む

predicateは、条件を1個だけ書くものではありません。

all_ofany_ofinvertedを使うことで、複数条件を組み合わせられます。

all_of:すべて満たしたら成功

all_ofは、複数の条件をすべて満たした時だけ成功します。

たとえば、雨が降っていて、かつ昼間の時間帯だけ成功させたい場合はこうです。

{
  "condition": "minecraft:all_of",
  "terms": [
    {
      "condition": "minecraft:weather_check",
      "raining": true
    },
    {
      "condition": "minecraft:time_check",
      "value": {
        "min": 0,
        "max": 12000
      },
      "period": 24000
    }
  ]
}

all_ofは、普通のプログラミングでいうAND条件です。

any_of:どれか1つ満たしたら成功

any_ofは、複数条件のうち1つでも満たせば成功します。

たとえば、雨または雷雨で成功させたい場合は、次のように書けます。

{
  "condition": "minecraft:any_of",
  "terms": [
    {
      "condition": "minecraft:weather_check",
      "raining": true
    },
    {
      "condition": "minecraft:weather_check",
      "thundering": true
    }
  ]
}

※天候判定ではraining:trueが雷雨も含むため、この例は考え方の説明用です。実際は条件の意味を確認して、重複しすぎないようにしてくださいね。

any_ofは、普通のプログラミングでいうOR条件です。

inverted:条件を反転する

invertedは、条件を反転します。

たとえば、雨ではない時だけ成功させるならこうです。

{
  "condition": "minecraft:inverted",
  "term": {
    "condition": "minecraft:weather_check",
    "raining": true
  }
}

unless predicateでも似たことはできますが、predicateファイル側で「これは晴れ判定です」と分けたい時はinvertedが便利です。


8. target selectorのpredicate=で対象を絞る

predicateは、execute if predicateだけでなく、ターゲットセレクターのpredicate=でも使えます。

たとえば、しゃがみ中のプレイヤーだけにメッセージを出すなら、次のように書けます。

tellraw @a[predicate=yuzukaki:player/is_sneaking] {"text":"しゃがんでいますね","color":"green"}

これは、@aの中からpredicateに合うプレイヤーだけを選ぶ書き方です。

execute as @a if predicate ...と比べると、処理が短く見えます。

execute as @a if predicate yuzukaki:player/is_sneaking run tellraw @s {"text":"しゃがんでいますね","color":"green"}

どちらでも似たことはできます。

ただし、個人的には最初はexecute as @a if predicateの形で覚える方が分かりやすいです。

理由は、

  • @sが誰なのか追いやすい
  • at @sを足して位置判定もしやすい
  • 条件を複数つなげる時に流れが見えやすい

からです。

慣れてきたら、対象を絞るだけの場面でpredicate=を使う、という使い分けがおすすめです。


9. execute if predicateで失敗しやすい条件タイプ

predicateで一番ややこしいのが、どの条件でもexecuteから使えるわけではないという点です。

predicateには、実行位置だけで判定できるものもあれば、ルートテーブルなどの特定の文脈が必要なものもあります。

たとえば、次のような条件は注意が必要です。

  • match_tool:採掘に使われた道具など、tool文脈が必要
  • block_state_property:採掘されたブロックの文脈が必要
  • damage_source_properties:ダメージ発生時の文脈が必要
  • killed_by_player:撃破者の文脈が必要
  • table_bonus:エンチャントや道具文脈が関係する

これらは、ルートテーブルや進捗の条件としては使えても、execute if predicateで単体チェックすると失敗することがあります。

ここでハマりやすいです
「JSONは合っているのに、なぜか常に失敗する」場合、必要な文脈が足りていない可能性があります。

初心者さんがexecute if predicateで使いやすいのは、まず次のあたりです。

  • weather_check
  • time_check
  • location_check
  • entity_properties
  • entity_scores
  • random_chance
  • all_of / any_of / inverted / reference

まずはこのあたりから触るのがおすすめです。

手持ちアイテム判定はexecute if itemsも候補

プレイヤーの手持ちアイテムを判定したいだけなら、predicateよりexecute if itemsの方が素直な場合もあります。

たとえば、メインハンドに特定のアイテムを持っていて、かつしゃがみ中だけ実行するなら、こんな形です。

execute as @a if items entity @s weapon.mainhand minecraft:stick if predicate yuzukaki:player/is_sneaking run tellraw @s {"text":"棒を持ってしゃがみ中です","color":"gold"}

アイテム判定はif items、プレイヤー状態判定はpredicate。

こうやって役割分担すると、コマンドが読みやすくなります。


10. Java版1.21.11以降で気を付けたい変更点

Java版は、1.20.5以降からアイテムコンポーネントやデータパック仕様がかなり変わっています。

predicate自体の基本、つまり、

data/<namespace>/predicates/<name>.json

に置いて、

execute if predicate <namespace>:<name> run ...

で呼ぶ考え方は変わりません。

ただし、周辺仕様は変わっています。

1.20.5以降はアイテムNBTの古い書き方に注意

古い記事では、アイテム判定にNBT直書きの例が残っていることがあります。

しかし、1.20.5以降はアイテムコンポーネントまわりの表記が変わっており、古いNBT例をそのまま写すと動かないことがあります。

特に、カスタムデータを持ったアイテム判定は、古い{tag:...}系の記事と、新しいコンポーネント表記の記事が混ざりやすいです。

そのため、本記事では手持ちアイテム判定をpredicateに無理やり詰めず、execute if itemsと組み合わせる形をおすすめしています。

1.21.2以降はplayer input判定が便利

Java版1.21.2以降では、playerのinput判定が使えるため、スニーク・ジャンプ・移動入力をpredicateで扱いやすくなっています。

しゃがみ判定を作るなら、古いflags系の例より、現在はtype_specificinputを使う形が分かりやすいです。

{
  "condition": "minecraft:entity_properties",
  "entity": "this",
  "predicate": {
    "type_specific": {
      "type": "minecraft:player",
      "input": {
        "sneak": true
      }
    }
  }
}

この形を覚えておくと、プレイヤー操作に反応するデータパックを作りやすくなります。

1.21.11ではデータパック形式が94.1になっています

Java版1.21.11では、データパック形式が94.1になっています。

また、Java版1.21.9以降はパック形式にマイナーバージョンが入り、pack.mcmetaではmin_formatmax_formatで対応範囲を指定する形に変わっています。

そのため、94.1のような値をJSONの小数としてそのまま書くのではなく、必要に応じて[94, 1]のような2つの整数のリストとして扱います。

このため、pack.mcmetaが古い書き方や古い形式番号のままだと、データパック選択画面で警告が出ることがあります。

ただし、predicateの基本的な置き場所や、execute if predicateの呼び出し方そのものは、この記事で紹介した形で考えて大丈夫です。

26.1以降はワールド保存構造の変更にも注意

Java版26.1では、ワールド保存構造など大きめの技術変更が入っています。

通常のデータパック制作でdata/<namespace>/predicates/に置く考え方はそのままですが、ワールド内部の保存場所やデータ管理まわりは変わっています。

データパックを配布する場合や、古いワールドから持ち越す場合は、必ず対象バージョンで/reloadして確認しましょう。

結論
predicateそのものより、周辺のアイテム表記・pack形式・バージョン差で詰まりやすいです。
古い記事を参考にする時は、Java版の対象バージョンを必ず見てくださいね。


11. よく使うpredicate条件タイプ早見表

predicateには色々な条件タイプがあります。

全部を最初から覚える必要はありません。
まずは、execute if predicateで扱いやすいものから覚えるのがおすすめです。

条件タイプ 主な用途 executeでの使いやすさ
weather_check 雨・雷雨の判定 使いやすい
time_check 時間帯の判定 使いやすい
location_check バイオーム・位置・ブロック周辺の判定 実行位置に注意すれば使いやすい
entity_properties プレイヤーやMobの状態判定 thisの文脈に注意
entity_scores スコアボード値の判定 スコア管理と相性が良い
random_chance 確率判定 使いやすい
all_of / any_of AND・OR条件 複数条件の整理に便利
inverted 条件反転 晴れ判定などに便利
match_tool 採掘時の道具判定 execute単体では注意
block_state_property 採掘ブロックの状態判定 ルートテーブル向け


最初に触るなら、weather_check・location_check・entity_propertiesの3つがおすすめです。

この3つだけでも、

  • 雨の日だけイベント発生
  • 特定バイオームでだけ能力発動
  • しゃがみ中だけ特殊効果

のような仕組みが作れます。


12. predicateが動かない時のチェックポイント

predicateを書いたのに動かない
execute if predicateが反応しない
JSONは合っているはずなのに失敗する

👉そういう時は、下のチェックポイントを使ってください。

  • [ ] data/<namespace>/predicates/の中に置いているか?
  • [ ] ファイル名は.jsonになっているか?
  • [ ] 呼び出す時に.jsonまで書いていないか?
  • [ ] /reload後にエラーが出ていないか?
  • [ ] JSONの最後に余計なカンマが入っていないか?
  • [ ] conditionの名前にminecraft:を付け忘れていないか?
  • [ ] as @aだけでなく、位置判定が必要ならat @sも入れているか?
  • [ ] entity: "this"を使うなら、as @aなどでthisに対象を入れているか?
  • [ ] match_toolなど、必要な文脈がない条件をexecute if predicateで使っていないか?
  • [ ] 古いバージョン向けの記事のNBT表記を、1.20.5以降の環境でそのまま使っていないか?
  • [ ] 1.21.9以降の環境で、pack.mcmetaが古いpack_formatだけの書き方のままになっていないか?

特に多いのは、位置判定なのにat @sが抜けているパターンです。

# 位置がプレイヤーにならない例
execute as @a if predicate yuzukaki:in_desert run say desert

プレイヤーの位置で判定したいなら、こうです。

# プレイヤーの位置で判定する例
execute as @a at @s if predicate yuzukaki:in_desert run say desert

この違いだけで、動く・動かないが変わることがあります。

また、predicateはJSONなので、構文ミスがあるとファイル自体が読み込まれません。

エラーが出たら、まずはログの行番号を見て、カンマ・波括弧・ダブルクォーテーションを確認しましょう。


13. まとめ

以上、マイクラJava版のpredicateとは何か、そしてexecute if predicateで条件判定する使い方を解説しました。

predicateは、最初に見ると難しそうですが、考え方はシンプルです。

要点を整理すると、

  • predicateは条件判定をJSONでまとめる仕組み
  • ファイルはdata/<namespace>/predicates/に置く
  • execute if predicate <namespace>:<path>で呼び出す
  • バイオーム判定ではat @sが重要
  • しゃがみ判定などはentity_propertiesで扱える
  • 複数条件はall_ofany_ofinvertedで整理できる
  • match_toolなどは文脈不足で失敗しやすいので注意

このあたりを押さえれば、predicateはかなり使いやすくなります。

個人的には、predicateは「難しい上級者向け機能」というより、データパックの条件分岐を整理するための便利道具だと思っています。

最初は、

{
  "condition": "minecraft:weather_check",
  "raining": true
}

このくらい短いものから試せば大丈夫です。

慣れてきたら、バイオーム判定、しゃがみ判定、複数条件の組み合わせへ進んでみてください。

では、本日はここまでで終わります。
最後までご覧いただき、ありがとうございました。


14. 参考文献

この記事を書くにあたり、以下の公式リリースノート・コミュニティWikiのページを参考にしています。