更新日:
最初に一度だけ実行する設定
/gamerule keep_inventory true
/gamerule immediate_respawn true
/gamerule fall_damage false
/scoreboard objectives add time dummy "タイム"
死んでも持ち物が残り、すぐに復活し、落下ダメージがなくなります。最後の行はタイム計測用のスコアです。この書き方はJava版1.21.11以降です。1.21.10以前と統合版は keepInventory・doImmediateRespawn・fallDamage と書きます(ゲームルール一覧)。
スタート地点
スタートに感圧板を置き、その真下にコマンドブロック(衝撃・動力が必要)を置きます。踏むとコマンドが1回動きます。複数のコマンドを動かすときは、チェーンコマンドブロックをつなげます。
/gamemode adventure @p
/spawnpoint @p ~ ~1 ~
/tag @p add running
/scoreboard players set @p time 0
アドベンチャーモードにするとブロックを壊せなくなり、コースを守れます。~ ~1 ~ はコマンドブロックの1つ上、つまり感圧板の位置です。コマンドブロックの種類は コマンドブロックの種類 にまとめています。
チェックポイント
/spawnpoint @p ~ ~1 ~
途中の足場にも、感圧板とその下のコマンドブロックを置きます。踏んだ場所が新しい復活地点になり、落ちてもそこからやり直せます。
落ちたらチェックポイントに戻す
コースの下を水や溶岩で満たし、反復コマンドブロック(常時実行)に次のコマンドを入れます。
/execute as @a[tag=running] at @s if block ~ ~ ~ minecraft:water run kill @s
水に入ったプレイヤーを倒し、最後に踏んだチェックポイントへ戻します。keepInventoryとdoImmediateRespawnの設定があるので、持ち物も残り、死亡画面も出ません。奈落を使うときは、高さで判定します。
/execute as @a[tag=running] at @s if entity @s[y=-64,dy=40] run kill @s
Y=-64から-24のあいだに入ったら戻します。コースの高さに合わせて数字を変えます。
タイムを計る
/scoreboard players add @a[tag=running] time 1
反復コマンドブロックに入れると、1秒に20ずつ増えます。秒で見たいときは、ゴールで20で割るか、表示のときに「20で1秒」と説明します。画面の右に出すときは /scoreboard objectives setdisplay sidebar time を一度実行します。
ゴール
/tag @p remove running
/title @p title {"text":"ゴール!","color":"gold"}
/tellraw @a [{"selector":"@p"},{"text":" がゴールしました! タイム:"},{"score":{"name":"@p","objective":"time"}},{"text":"(20で1秒)"}]
/gamemode survival @p
ゴールの感圧板の下に、チェーンでつないで入れます。running のタグを外すので、タイムが止まり、落下の判定もされなくなります。文字の出し方は titleとtellrawの使い方 を見てください。
うまくいかないときの確認ポイント
- 感圧板を踏んでも動かない:コマンドブロックが「衝撃」「動力が必要」になっているか、感圧板が真上にあるか確認します。
- 違う人が対象になる:
@pはコマンドブロックにいちばん近い人です。感圧板のすぐ上に立った人が選ばれます。 - 落ちても戻らない:反復コマンドブロックが「常時実行」になっているか、スタートで
runningのタグが付いたか確認します。 - チャットにコマンドの結果が流れる:
/gamerule commandBlockOutput falseで止められます。1.21.11以降は名前がminecraft:command_block_outputに変わっています。
よくある質問
統合版でも作れますか?
作れます。感圧板とコマンドブロックの組み方は同じです。統合版ではゲームルール名が小文字になり、セレクターの範囲の書き方が少し違います。
複数人で同時に遊べますか?
できます。タグとスコアはプレイヤーごとに付くので、それぞれのタイムが計れます。チェックポイントも人ごとに記録されます。
タイムを秒で表示できますか?
スコアを20で割ると秒になります。scoreboard players operation で割り算をするか、表示のときに20で1秒と書き添えます。