【マイクラ】scheduleコマンドの使い方・構文・関数予約実行を解説【Java版】

この記事はマイクラJava版の/scheduleコマンド解説です
統合版(BE)とは構文・使い方がかなり違うので注意してください
/scheduleは「普通のコマンドを遅らせるコマンド」ではなく、関数や関数タグを予約実行するコマンドです

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

マイクラJava版でコマンドやデータパックを触っていると、

「10秒後にこの処理を動かしたい」
「毎分1回だけ処理したい」
「tick.jsonで毎tick動かすのは重そうだから、間隔をあけて実行したい」

…みたいな場面、けっこう出てきますよね。

そういう時に使えるのが、今回紹介するscheduleコマンドです。

ただしこのコマンド、最初に触ると少しクセがあります。
/schedule say test 10sみたいに、好きなコマンドをそのまま10秒後に実行することはできません。
実行予約できるのは、データパック内の関数(.mcfunction)または関数タグです。
この記事では、まず関数を中心に扱います。

ここを知らずに使おうとすると、ほぼ確実につまずきます。
筆者も最初に見た時、「あれ、これコマンドブロックの遅延版じゃないの?」と勘違いしました。

この記事では、マイクラJava版の/scheduleコマンドの構文・使い方・append/replaceの違い・clearでの解除方法・関数を使った予約実行の組み方まで、実際に使う流れに沿って解説していきますね。

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

  • /schedule functionで関数を指定時間後に実行できます👍
  • replaceappendの違いが分かります👌
  • 関数を自分自身で再予約して、一定間隔処理を作れます
  • 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_packtest_packなど、お好きな名前に変えて大丈夫です。
ただし、大文字・日本語・スペースは避けるのが安全です。

古い記事の「functions」表記に注意

ここは、バージョン違いでつまずきやすいです。

昔のデータパック解説では、

data/yuzu/functions/

のように、functionsと複数形で書かれていることがあります。

しかし、Java版1.21以降の新しい構成では、基本的に

data/yuzu/function/

のように、function(単数形)を使います。

さらに、tick.jsonload.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

この関数を一度実行すると、

  1. メッセージを出す
  2. 30秒後に自分自身を予約する
  3. 30秒後にまた実行される
  4. また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の時間指定は、この記事で説明したtsdの形で扱えますが、ワールド全体の時間管理やデータパックの高度な時間制御をする場合は、26.1以降の公式リリースノートも確認しておくと安全です。

普通に「30秒後に関数を動かす」「1分ごとに処理する」くらいなら、この記事の範囲で十分です。
ただ、凝ったデータパックを作る場合は、時間関連の仕様変更に注意しましょう。


13. まとめ

以上、マイクラJava版のscheduleコマンドの使い方・構文・関数予約実行の組み方を解説しました。

要点を整理すると、

  • /scheduleは、関数や関数タグを指定時間後に実行予約するコマンド
  • 普通のコマンドを直接遅延実行するのではなく、.mcfunctionに書いてから呼び出す
  • 時間指定はtsdが使える
  • 初心者さんは、まず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のページを参考にしています。