更新日:
1. コースを作る
ボートは氷の上だと地面よりずっと速く走ります。packed_ice(氷塊)より blue_ice(青氷)のほうが速いので、直線は青氷、カーブは氷塊にすると曲がりやすくなります。広い範囲に敷くときは /fill を使います。
/fill ~ ~-1 ~ ~20 ~-1 ~4 blue_ice
一度に変えられるブロックの数には上限があるので、長いコースは何回かに分けて敷きます。詳しくは fillコマンドを安全に使う方法 を見てください。
2. 準備(最初に一度だけ)
/scoreboard objectives add cp dummy
/scoreboard objectives add lap dummy "周回"
/scoreboard objectives add time dummy
/scoreboard objectives setdisplay sidebar lap
/scoreboard players set #20 time 20
cp は次に通るチェックポイントの番号、lap は周回数、time はタイムを数えるスコアです。#20 はタイムを秒に直すときに使う「20」という数です。
3. チェックポイントの目印を置く
/summon marker ~ ~ ~ {Tags:["cp1"]}
/summon marker ~ ~ ~ {Tags:["cp2"]}
/summon marker ~ ~ ~ {Tags:["goal"]}
コースの3分の1あたり、3分の2あたり、スタート兼ゴールの線のまん中に立って、それぞれ1回ずつ実行します。コースが長いときは cp3、cp4 と増やします。
4. スタートの合図
/scoreboard players set @a cp 0
/scoreboard players set @a lap 0
/scoreboard players set @a time 0
/tag @a add racing
/title @a title {"text":"スタート!","color":"green"}
ボタンを押すと上から順に動くように、インパルスとチェーンのコマンドブロックで並べます。最初にスコアを0にしておくのが大事です。スコアが空のままだと、5の条件 scores={cp=0} に当てはまりません。ボートは /give @a oak_boat で配ります。
5. チェックポイントを順番に通す(くり返し)
/execute at @e[type=marker,tag=cp1] as @a[distance=..4,scores={cp=0}] run scoreboard players set @s cp 1
/execute at @e[type=marker,tag=cp2] as @a[distance=..4,scores={cp=1}] run scoreboard players set @s cp 2
/execute at @e[type=marker,tag=goal] as @a[distance=..4,scores={cp=2}] run scoreboard players add @s lap 1
/execute at @e[type=marker,tag=goal] as @a[distance=..4,scores={cp=2}] run scoreboard players set @s cp 0
1行目をくり返しコマンドブロック(常時実行)に入れ、残りをチェーンでつなげます。チェックポイント1を通ると cp が1になり、1の人だけがチェックポイント2で2になり、2の人だけがゴールで周回が1増えます。途中を飛ばしてゴールに着いても周回は増えません。コースの幅が広いときは distance=..4 の数を大きくします。
6. タイムを数える(くり返し)
/scoreboard players add @a[tag=racing] time 1
1ティック(20分の1秒)ごとに1ずつ増えます。走っている人だけ数えるので、ゴールした人のタイムはそこで止まります。
7. ゴールの判定(くり返し)
/tag @a[tag=racing,scores={lap=3..}] add goal_now
/tag @a[tag=goal_now] remove racing
/execute as @a[tag=goal_now] run scoreboard players operation @s time /= #20 time
/execute as @a[tag=goal_now] run tellraw @a [{"selector":"@s"},{"text":" がゴール! タイム:"},{"score":{"name":"@s","objective":"time"}},{"text":"秒"}]
/tag @a[tag=goal_now] remove goal_now
3周した人に goal_now タグを付け、タイムを20で割って秒に直してから、全員に表示します。最後にタグを外すので、表示は1人につき1回だけです。周回数を変えるときは lap=3.. の数を変えます。
うまくいかないときの確認ポイント
- チェックポイントが反応しない:スタートでスコアを0にしたか、目印からの距離が足りているか確認します。目印の場所は
/execute at @e[type=marker,tag=cp1] run particle flame ~ ~1 ~で見えるようにできます。 - 周回が一気に増える:5の4行目で
cpを0に戻しているか確認します。 - タイムが0秒になる:6のコマンドが動いているか、
#20を20にしたか確認します。 - ボートが壊れてなくなる:ボートを壊されないようにするには、ゲームモードをアドベンチャーにします。
よくある質問
馬のレースにも使えますか?
同じしくみで使えます。馬の出し方は最強の馬を出すコマンドの記事を参考にしてください。
タイムを小数点まで出せますか?
time を2で割ると10分の1秒の数になります。表示するときに秒と小数に分けて書くと、より細かく出せます。
1位だけを知らせられますか?
最初にゴールした人にだけ first タグを付け、first タグを持つ人がいないときだけ付ける条件にすると、1位だけを表示できます。