
この記事はマイクラJava版の/scheduleコマンド解説です
統合版(BE)とは構文・使い方がかなり違うので注意してください
/scheduleは「普通のコマンドを遅らせるコマンド」ではなく、関数や関数タグを予約実行するコマンドです
こんにちは。ゆずかきです。
マイクラJava版でコマンドやデータパックを触っていると、
「10秒後にこの処理を動かしたい」
「毎分1回だけ処理したい」
「tick.jsonで毎tick動かすのは重そうだから、間隔をあけて実行したい」
…みたいな場面、けっこう出てきますよね。
そういう時に使えるのが、今回紹介するscheduleコマンドです。
ただしこのコマンド、最初に触ると少しクセがあります。
/schedule say test 10sみたいに、好きなコマンドをそのまま10秒後に実行することはできません。
実行予約できるのは、データパック内の関数(.mcfunction)または関数タグです。
この記事では、まず関数を中心に扱います。
ここを知らずに使おうとすると、ほぼ確実につまずきます。
筆者も最初に見た時、「あれ、これコマンドブロックの遅延版じゃないの?」と勘違いしました。
この記事では、マイクラJava版の/scheduleコマンドの構文・使い方・append/replaceの違い・clearでの解除方法・関数を使った予約実行の組み方まで、実際に使う流れに沿って解説していきますね。
この記事を読めば、次のことが出来るようになります。
/schedule functionで関数を指定時間後に実行できます👍replaceとappendの違いが分かります👌- 関数を自分自身で再予約して、一定間隔処理を作れます
tick.jsonで毎tick動かさず、軽めの定期処理を作れるようになります(^^♪
それでは、やっていきましょう!
※本記事はJava版のコマンド仕様を前提にしています。
※ゲーム内の仕様については、Minecraft Wikiおよび公式リリースノートを参考にしています。
※Java版1.21.11以降ではデータパック周りの表記・バージョン番号が変わることがあるため、データパックのひな形は使用中のバージョンに合わせてください。
目次
1. scheduleコマンドとは
2. scheduleコマンドで出来ること・出来ないこと
3. scheduleコマンドの基本構文
4. 関数(mcfunction)を用意する前提を確認する
5. 時間指定の単位|t・s・dの違い
6. replaceとappendの違い
7. schedule clearで予約を消す方法
8. 実例1:10秒後にメッセージを出す
9. 実例2:30秒ごとに処理を繰り返す
10. 実例3:tick.jsonの負荷を減らす考え方
11. よくある失敗と対処法
12. Java版1.21.11以降で気を付けたい変更点
13. まとめ
14. 引用・参考文献
この記事で分かること
・マイクラJava版のscheduleコマンドの使い方
・関数を遅延実行する構文
・append / replace / clearの使い分け
・データパックで定期処理を作る時の考え方

1. scheduleコマンドとは
scheduleコマンドは、指定した関数や関数タグを、指定した時間が経ったあとにサーバー側で実行予約するコマンドです。
Java版では、主に次のような用途で使います。
- 数秒後にイベントを発生させる
- 一定時間後に関数を呼び出す
- 関数を自分自身で再予約して、定期処理を作る
- 毎tick処理を避けて、負荷を下げる
例えば、
schedule function yuzu:test/after_10s 10s replace
このように書くと、yuzu:test/after_10sという関数を10秒後に実行予約できます。
ここで大事なのは、/scheduleが実行する対象は関数や関数タグだという点です。
/sayや/giveや/tpを、そのまま予約するコマンドではありません。
注意!
/schedule say こんにちは 10s
みたいな書き方はできません。
遅らせたい処理は、いったん.mcfunctionファイルの中に書いて、それをschedule functionで呼び出しましょう。
この仕様を理解しておくと、scheduleコマンドはかなり便利です。
逆にここを勘違いすると、最初の1行目から詰まります。

2. scheduleコマンドで出来ること・出来ないこと
まずは、scheduleコマンドの役割を整理しておきましょう。
| やりたいこと | scheduleで可能? | 補足 |
|---|---|---|
| 10秒後に関数を実行 | 可能 | 最も基本的な使い方です |
| 普通のコマンドをそのまま遅延実行 | 不可 | 関数に入れてから予約します |
| 毎分1回だけ処理する | 可能 | 関数内で自分自身を再予約します |
| すでに予約した関数を取り消す | 可能 | schedule clearを使います |
| 実行者や実行位置をそのまま保持 | 注意が必要 | 予約実行時はサーバー実行扱いになります |
特に注意したいのが、最後の実行者や実行位置です。
Java版のscheduleで予約された関数は、指定時間後にサーバー側で実行されます。
しかも、execute as ...を使って予約したとしても、予約後の関数は基本的にサーバーがワールドスポーン地点で実行する扱いになります。
つまり、
execute as @p at @s run schedule function yuzu:test/later 10s replace
このように書いても、10秒後のyuzu:test/laterの中で、予約したプレイヤー本人が@sとして残っているわけではありません。
ここ、かなり大事です。
プレイヤーごとの処理を遅延させたい場合は、スコアボードやタグ、Marker、storageなどを使って、誰に対して後から処理するのかを別で管理する必要があります。
最初は難しく考えず、まずは「全体にメッセージを出す」「一定時間ごとに全体処理する」くらいから触るのがおすすめです。

3. scheduleコマンドの基本構文
Java版のscheduleコマンドの基本構文は、下記です。
schedule function <function> <time> [append|replace]
予約を消す場合は、下記です。
schedule clear <function>
それぞれの意味は、こんな感じです。
| 項目 | 意味 | 例 |
|---|---|---|
| <function> | 予約実行したい関数名、または#付きの関数タグ | yuzu:test/start |
| <time> | 何tick後・何秒後・何日後に実行するか | 20t / 10s / 1d |
| replace | 同じ関数の未実行予約を置き換える | 初期値 |
| append | 別時間の予約を追加する | 複数タイミング実行に使用 |
| clear | 未実行の予約を削除する | schedule clear yuzu:test/start |
普通に使うなら、最初はreplaceでOKです。
replaceは省略できるので、
schedule function yuzu:test/start 10s
と書いても、基本的にはreplace扱いになります。
ただ、記事内では分かりやすさ優先で、あえてreplaceまで書いて解説しますね。
schedule function yuzu:test/start 10s replace
この方が、「今は置き換え予約で動かしているんだな」と見て分かりやすいです。

4. 関数(mcfunction)を用意する前提を確認する
scheduleコマンドを使うには、データパック内に関数ファイルを用意する必要があります。
Java版1.21以降の基本イメージは、下記のような構成です。
ワールドフォルダ
└── datapacks
└── yuzu_schedule
├── pack.mcmeta
└── data
└── yuzu
└── function
└── test
├── start.mcfunction
└── after_10s.mcfunction
今回の記事では、名前空間をyuzuとして説明します。
自分で作る場合は、my_packやtest_packなど、お好きな名前に変えて大丈夫です。
ただし、大文字・日本語・スペースは避けるのが安全です。
古い記事の「functions」表記に注意
ここは、バージョン違いでつまずきやすいです。
昔のデータパック解説では、
data/yuzu/functions/
のように、functionsと複数形で書かれていることがあります。
しかし、Java版1.21以降の新しい構成では、基本的に
data/yuzu/function/
のように、function(単数形)を使います。
さらに、tick.jsonやload.jsonを置くタグフォルダも、現在は
data/minecraft/tags/function/
という形になります。
注意!
古い解説を見ながら作っている方は、functionsフォルダのままで「Unknown function」になることがあります。
Java版1.21以降で動かすなら、まずフォルダ名を確認しましょう。
mcfunctionファイル内ではスラッシュを書かない
.mcfunctionファイルの中では、コマンドの先頭に/を書きません。
OK例:
tellraw @a {"text":"こんにちは","color":"green"}
NG例:
/tellraw @a {"text":"こんにちは","color":"green"}
ゲーム内チャットでは/tellrawと書きますが、関数ファイル内では/を外します。
これも初心者さんがよく引っかかるところです。

5. 時間指定の単位|t・s・dの違い
scheduleコマンドの<time>には、時間の単位を付けられます。
使える単位は、下記です。
| 単位 | 意味 | 換算 | 例 |
|---|---|---|---|
| t | ゲームTick | 20t = 1秒 | 20t |
| s | 秒 | 1s = 20t | 10s |
| d | ゲーム内1日 | 1d = 24000t | 1d |
ここでの秒は、通常の1秒 = 20ゲームTickとして換算される指定です。
サーバーが重い時や/tick系でゲームTickの進み方を変えている時は、現実の時計と完全に同じとは限りません。
例えば、下記は同じ意味です。
schedule function yuzu:test/after 20t replace schedule function yuzu:test/after 1s replace
どちらも、通常の進み方なら約1秒後に関数を実行します。
初心者さんは、まずsを使えば分かりやすいと思います。
schedule function yuzu:test/after 10s replace
これなら、見たまま「10秒後」です。
0tは使えない
scheduleは、基本的に少し後に実行するためのコマンドです。
そのため、0tのような指定は使えません。
すぐ実行したいなら、普通に
function yuzu:test/after
で呼び出せばOKです。
1tick後に回したい場合は、
schedule function yuzu:test/after 1t replace
のように、1t以上で指定しましょうね。

6. replaceとappendの違い
schedule functionの最後には、replaceまたはappendを指定できます。
schedule function yuzu:test/run 10s replace schedule function yuzu:test/run 10s append
この2つ、かなり大事です。
replace:同じ関数の予約を置き換える
replaceは、同じ関数がすでに予約されている場合、未実行の予約を新しい予約に置き換える動きです。
schedule function yuzu:test/run 30s replace
この予約を入れたあと、まだ実行される前に、もう一度
schedule function yuzu:test/run 10s replace
を実行すると、基本的には新しい予約に置き換わります。
「この関数は、常に次の1回分だけ予約されていればOK」という処理では、replaceが使いやすいです。
定期実行を作る時も、まずはreplaceで十分です。
append:別タイミングの予約を追加する
appendは、同じ関数でも別の実行タイミングとして予約を追加したい時に使います。
schedule function yuzu:event/firework 5s append schedule function yuzu:event/firework 10s append schedule function yuzu:event/firework 15s append
このようにすると、5秒後・10秒後・15秒後のように、複数のタイミングで同じ関数を予約できます。
ただし、Java版では同じ関数を同じゲームTickに2つ予約することはできません。
例えば、同じ瞬間に同じ関数を何度も追加するような作りは、思った通りに動かない可能性があります。
使い分けの目安
・基本はreplace
・複数タイミングで同じ関数を起動したい時だけappend
・ループ処理はreplaceの方が管理しやすいです
筆者としては、最初はappendを無理に使わなくていいと思います。
まずはreplaceで、確実に1回予約する動きに慣れましょう。

7. schedule clearで予約を消す方法
予約済みの関数を取り消したい時は、schedule clearを使います。
schedule clear yuzu:test/run
これで、yuzu:test/runに入っている未実行の予約を削除できます。
例えば、30秒ごとの定期処理を止めたい時にも使えます。
schedule clear yuzu:timer/loop
ただし、schedule clearはすでに実行された関数を巻き戻すコマンドではありません。
あくまで、まだ実行されていない予約を消すだけです。
clear時は名前空間を省略しない
schedule clearでは、関数名をしっかり指定しましょう。
OK例:
schedule clear yuzu:timer/loop
関数タグを消す場合も、#付きで指定します。
schedule clear #yuzu:timer/all
minecraft:名前空間の関数やタグを対象にする場合も、基本的に名前空間まで書くのが安全です。
予約が無い関数をclearすると失敗扱いになる
まだ予約されていない関数に対して
schedule clear yuzu:test/run
を実行すると、「消す予約がない」ため失敗扱いになります。
とはいえ、定期処理を停止するボタンのような用途なら、失敗しても実害は少ないです。
「予約があれば消える、なければ何も起きない」くらいの感覚で扱えばOKです。

8. 実例1:10秒後にメッセージを出す
ここからは、実際の書き方を見ていきましょう。
まずは一番シンプルに、10秒後にチャットへメッセージを出す関数を作ります。
1. 関数ファイルを2つ用意する
今回は下記の2つを用意します。
data/yuzu/function/test/start.mcfunction data/yuzu/function/test/after_10s.mcfunction
start.mcfunctionは、予約を開始する関数。
after_10s.mcfunctionは、10秒後に実行される関数です。
2. start.mcfunctionを書く
tellraw @a {"text":"10秒後にメッセージを出します。","color":"yellow"}
schedule function yuzu:test/after_10s 10s replace
これで、実行した瞬間に黄色のメッセージを出しつつ、10秒後にafter_10sを予約します。
3. after_10s.mcfunctionを書く
tellraw @a {"text":"10秒たちました!","color":"green"}
この関数が、10秒後に実行されます。
4. ゲーム内で実行する
データパックを読み込んだら、ゲーム内で下記を実行します。
/function yuzu:test/start
すると、まず
10秒後にメッセージを出します。
が表示され、10秒後に
10秒たちました!
が表示されれば成功です。
ここまで出来れば、scheduleコマンドの基本は掴めています。
まずはこの形で、遅延実行の感覚を掴みましょう。

9. 実例2:30秒ごとに処理を繰り返す
次は、scheduleコマンドの便利な使い方です。
関数の最後で自分自身をもう一度schedule予約すると、一定間隔で処理を繰り返せます。
これが、かなり便利です。
1. loop.mcfunctionを用意する
data/yuzu/function/timer/loop.mcfunction
中身は下記のようにします。
tellraw @a {"text":"30秒ごとの定期処理です。","color":"aqua"}
schedule function yuzu:timer/loop 30s replace
この関数を一度実行すると、
- メッセージを出す
- 30秒後に自分自身を予約する
- 30秒後にまた実行される
- また30秒後に自分自身を予約する
という流れになります。
2. 開始する
/function yuzu:timer/loop
これで、30秒ごとの処理が始まります。
3. 停止する
止めたい場合は、下記です。
/schedule clear yuzu:timer/loop
これで、未実行の予約を消せます。
停止フラグを作るとより安全
本格的に作るなら、スコアボードでON/OFFを管理するのがおすすめです。
まず、初期化用の関数を作ります。
scoreboard objectives add yz_timer dummy scoreboard players set #run yz_timer 1 function yuzu:timer/loop_safe
次に、loop_safe.mcfunctionを作ります。
execute if score #run yz_timer matches 1 run tellraw @a {"text":"30秒ごとの安全な定期処理です。","color":"aqua"}
execute if score #run yz_timer matches 1 run schedule function yuzu:timer/loop_safe 30s replace
停止したい時は、
scoreboard players set #run yz_timer 0 schedule clear yuzu:timer/loop_safe
これで、予約の削除だけでなく、次に動いたとしても再予約しない形にできます。
体験談的な注意
定期処理は、一度作ると便利すぎて増やしがちです。
ただ、何でもかんでも短い間隔で回すと重くなります。
最初は30秒・60秒くらいの長めの間隔で作ると、管理しやすいです。

10. 実例3:tick.jsonの負荷を減らす考え方
データパックでは、minecraft:tickタグに関数を登録すると、毎tick実行できます。
ただし、毎tick実行は便利な反面、処理内容が重いと負荷が増えます。
マイクラは基本的に1秒20tickなので、毎tick処理は1秒に20回実行されます。
軽い処理なら問題ないことも多いですが、広範囲の検知や大量のエンティティ処理を毎tick回すのは、あまり初心者向けではありません。
そこで使えるのが、scheduleによる間隔処理です。
毎tick必要ない処理はscheduleに回す
例えば、下記のような処理は、必ずしも毎tickでなくても良いことが多いです。
- 30秒ごとのアナウンス
- 1分ごとのエリアチェック
- 数秒ごとのパーティクル演出
- 一定間隔でのスコア更新
- イベント開始から数秒後の演出
こういうものは、tick.jsonに全部詰め込むより、scheduleで間隔を作った方が管理しやすいです。
load.jsonで初回起動だけする
ワールド読み込み時や/reload時に定期処理を始めたいなら、load.jsonから開始関数を呼び出す形が便利です。
構成例:
data/minecraft/tags/function/load.json data/yuzu/function/load.mcfunction data/yuzu/function/timer/loop_safe.mcfunction
load.jsonの中身:
{ "values": [ "yuzu:load" ] }
load.mcfunctionの中身:
scoreboard objectives add yz_timer dummy scoreboard players set #run yz_timer 1 schedule function yuzu:timer/loop_safe 30s replace
これで、データパック読み込み時に30秒後の処理を予約できます。
注意!
minecraft:loadは、ワールド読み込み時や/reload時に実行されます。
何度も/reloadする環境では、予約が重複しないようにreplaceを使うのが安全です。
tick.jsonとscheduleの使い分け
整理すると、こんな使い分けです。
| 用途 | おすすめ | 理由 |
|---|---|---|
| 毎tickの当たり判定 | tick.json | 即時性が必要 |
| 数秒ごとの演出 | schedule | 毎tickでなくて良い |
| 1分ごとの通知 | schedule | 間隔処理で十分 |
| 初回起動処理 | load.json | 読み込み時だけ実行 |
| 遅延イベント | schedule | 時間差演出に向いている |
毎tick必要なものはtick.json。
毎tick必要ないものはschedule。
この考え方だけでも、データパックの作り方がかなり整理されます。

11. よくある失敗と対処法
ここからは、scheduleコマンドでよくある失敗をまとめます。
エラーが出た時は、まずここを確認してみてください。
1. 普通のコマンドを直接予約しようとしている
NG例:
schedule say test 10s
これはできません。
scheduleで予約できるのは、基本的に関数や関数タグです。
OK例:
schedule function yuzu:test/after_10s 10s replace
遅らせたい処理は、.mcfunctionに入れてから呼び出しましょう。
2. 関数ファイル内にスラッシュを書いている
NG例:
/tellraw @a {"text":"テスト"}
OK例:
tellraw @a {"text":"テスト"}
関数ファイル内では、先頭の/は不要です。
3. functionフォルダ名が古い
Java版1.21以降では、基本的に
data/yuzu/function/
です。
古い記事の通りに
data/yuzu/functions/
としていると、関数が読み込まれないことがあります。
/function yuzu:と入力しても候補が出ない場合、まずフォルダ構成を見直しましょう。
4. /reloadしていない
関数ファイルを書き換えた後は、ゲーム内で
/reload
を実行しましょう。
/reloadしないと、変更した関数が反映されないことがあります。
5. 予約後の関数で@sを使っている
scheduleで実行された関数は、予約したプレイヤー本人が@sとして残るわけではありません。
NGになりやすい例:
give @s minecraft:diamond 1
予約後の関数内で@sを使うと、思った対象に処理されない可能性があります。
全員に配るなら、
give @a minecraft:diamond 1
特定プレイヤーに配りたいなら、タグやスコアボードで対象を管理しましょう。
6. appendで予約を増やしすぎている
appendは便利ですが、気づかないうちに予約を増やしすぎると管理が難しくなります。
初心者さんは、まずreplace中心で組むのがおすすめです。
schedule function yuzu:timer/loop 30s replace
これなら、同じ関数の予約が基本1つにまとまりやすいです。

12. Java版1.21.11以降で気を付けたい変更点
scheduleコマンドの基本構文自体は、Java版では下記の形で考えればOKです。
schedule function <function> <time> [append|replace] schedule clear <function>
ただし、Java版1.21.11以降の環境でデータパックを作る場合、周辺仕様にはいくつか注意点があります。
1. データパックのバージョン表記が変わることがある
Java版1.21.11では、公式リリースノート上でデータパックバージョンが94.1と案内されています。
さらに、Java版26.1ではデータパックバージョンが101.1になり、95〜101.1系の変更が入っています。
そのため、pack.mcmetaの書き方は、使用しているバージョンに合わせて確認してください。
古い記事のpack_formatだけをそのままコピーすると、警告が出たり、データパックが読み込まれなかったりする場合があります。
この記事では、scheduleコマンド本体の使い方を中心に解説しています。
実際にデータパックを配布する場合は、対象バージョンのpack.mcmetaも合わせて確認しましょう。
2. Java版1.21以降はフォルダ名が単数形になっている
先ほども触れましたが、ここは本当に大事です。
旧:
functions
新:
function
旧:
tags/functions
新:
tags/function
古いデータパックを持ってきた場合は、このフォルダ名の違いで動かないことがあります。
3. 1.21.11でstopwatchコマンドが追加されている
Java版1.21.11では、stopwatchコマンドが追加されています。
これはゲームTickに依存しない経過時間を扱うためのコマンドで、/scheduleとは役割が違います。
schedule:指定したゲームTick後に関数を予約実行するstopwatch:ゲームTickに依存しない経過時間を計測・比較する
というイメージで分けると分かりやすいです。
「10秒後に関数を動かしたい」ならschedule。
「経過時間が10秒を超えたか判定したい」ならstopwatch。
この2つは似ているようで、使いどころが違います。
4. 26.1では/time周りにWorld Clocksの変更がある
Java版26.1では、/timeコマンド周りがWorld Clocksベースに変わっています。
scheduleの時間指定は、この記事で説明したt・s・dの形で扱えますが、ワールド全体の時間管理やデータパックの高度な時間制御をする場合は、26.1以降の公式リリースノートも確認しておくと安全です。
普通に「30秒後に関数を動かす」「1分ごとに処理する」くらいなら、この記事の範囲で十分です。
ただ、凝ったデータパックを作る場合は、時間関連の仕様変更に注意しましょう。

13. まとめ
以上、マイクラJava版のscheduleコマンドの使い方・構文・関数予約実行の組み方を解説しました。
要点を整理すると、
/scheduleは、関数や関数タグを指定時間後に実行予約するコマンド- 普通のコマンドを直接遅延実行するのではなく、
.mcfunctionに書いてから呼び出す - 時間指定は
t・s・dが使える - 初心者さんは、まず
replaceを使えばOK - 複数タイミングで同じ関数を予約したい時だけ
appendを使う - 予約を消す時は
schedule clear <function> - 定期処理は、関数の最後で自分自身を再予約すると作れる
- 予約実行時はサーバー実行扱いになるので、
@sや実行位置には注意
このあたりを押さえておけば、scheduleコマンドはかなり使いやすくなります。
特に、tick.jsonで毎tick処理しなくても良いものをscheduleに逃がせるようになると、データパックの設計がかなり楽になります。
最初は、
schedule function yuzu:test/after_10s 10s replace
この1行からで大丈夫です。
10秒後に関数が動く感覚を掴んでから、30秒ごとの処理、1分ごとの処理、イベント演出…と広げていきましょう。
では、本日はここまでで終わります。
最後までご覧いただき、ありがとうございました。
柚子クラでは他にもマイクラJava版のコマンド・データパック系の解説をしているので、是非ご覧くださいね(^^♪
14. 引用・参考文献
この記事を書くにあたり、以下の公式情報・コミュニティWikiのページを参考にしています。