更新日:
5秒後にファンクションを実行する
/schedule function mypack:explode 5s
mypack:explode は、データパックの中の data/ にあたるファンクションです(1.20.6以前はフォルダ名が functions)。ファンクションの作り方はデータパックの基本で説明しています。
時間の書き方
| 書き方 | 意味 |
|---|---|
20t または 20 | 20ティック(1秒) |
5s | 5秒(100ティック) |
1d | ゲーム内の1日(24000ティック、約20分) |
単位を付けないときはティックとして扱われます。
一定の間隔でくり返す(ループ)
ファンクションの最後で、自分自身をもう一度予約すると、くり返し動き続けます。
# data/mypack/function/loop.mcfunction
effect give @a minecraft:regeneration 3 0 true
schedule function mypack:loop 10s
一度 /function mypack:loop を実行すると、その後は10秒ごとに全員へ再生の効果を付けます。毎ティック動かすより処理が軽いので、サーバーの負担を減らせます。
予約を取り消す
/schedule clear mypack:loop
上のループを止めるときに使います。取り消すまで、ワールドを閉じても予約は残ります。
replace と append の違い
| 書き方 | 同じファンクションがすでに予約されているとき |
|---|---|
/schedule function mypack:a 5s replace | 前の予約を消して、新しい時間で予約し直す(省略したときはこちら) |
/schedule function mypack:a 5s append | 前の予約を残したまま、もう1つ追加する |
実行する人と場所に注意
予約したファンクションは、プレイヤーではなくサーバー(ワールドの初期スポーン地点)として実行されます。そのため、ファンクションの中で @s や ~ ~ ~ を使っても、予約したプレイヤーにはなりません。プレイヤーごとに動かしたいときは、ファンクションの中で execute as @a at @s run … と書きます。
3・2・1のカウントダウン
# data/mypack/function/start.mcfunction
title @a title "3"
schedule function mypack:count2 1s
# data/mypack/function/count2.mcfunction
title @a title "2"
schedule function mypack:count1 1s
# data/mypack/function/count1.mcfunction
title @a title "1"
schedule function mypack:go 1s
# data/mypack/function/go.mcfunction
title @a title {"text":"スタート!","color":"green"}
それぞれのファンクションが数字を表示して、1秒後に次のファンクションを予約します。ゲームを始めるときは /function mypack:start を実行するだけです。
1人のプレイヤーだけ少し後に処理する
予約したファンクションは、だれが予約したかを覚えていません。先にタグで印を付けておきます。
# わなを踏んだときに実行
tag @s add trapped
schedule function mypack:release 5s
# data/mypack/function/release.mcfunction
tp @a[tag=trapped] 0 64 0
tag @a remove trapped
5秒以内に別の人もわなを踏むと、初期設定の replace によってタイマーがやり直しになり、2人まとめて解放されます。1人ずつ別々に時間を計りたいときは、スコアボードでティック数を数える方法を使います。
統合版との違い
統合版にも /function と /schedule はありますが、統合版の /schedule は書き方がまったく違い、もともとは「エリアが読み込まれたときに実行する」ための機能です。この記事の書き方は統合版では使えません。統合版で時間をおいて実行するときは、スコアボードでティックを数える方法が確実です。
動かないときの確認ポイント
- 「不明なファンクション」と出る:
/reloadでデータパックを読み直し、/datapack listで有効になっているか確認します。フォルダ名(1.21以降はfunction)も確認します。 - @s が効かない:上の「実行する人と場所」のとおり、予約した実行ではプレイヤーが対象になりません。
- ループが止まらない:
/schedule clearで取り消します。
よくある質問
コマンドを直接予約できますか?
できません。/schedule で予約できるのはファンクション(またはファンクションのタグ)だけです。
ゲームを一時停止すると時間も止まりますか?
ゲーム内の時間で数えるので、シングルプレイで一時停止している間は進みません。
昼夜の進行を止めるgameruleを使うと止まりますか?
止まりません。doDaylightCycle(1.21.11以降は advance_time)で昼夜を止めても、/schedule はゲームのティックで数えるので予定どおり実行されます。