どうも!パイセンです。
今回はBE(スマホ・switch・win10等)でもできるscoreboard式タイマーの作り方を紹介します。
とてもシンプルなので、scoreboard入門としても良いコマンドなのではないでしょうか?
では早速作っていきます。
完成品はこんな感じ(動画)
完成品はこのようになっています。
右の赤い数字がタイマーです。
白い数字はおそらくmob一体一体を区別するIDのようなものだと思われます。(BEにはあまり詳しくないので、違ったらコメントでご指摘ください・・・。)
作り方
1.タイマーの時間を管理するための防具立てを設置
まずはタイマーの時間を管理するための防具立てを設置します。
防具立てを置き、『time』という名札で名前を付けましょう。この防具立てに/scoreboardコマンドを使ってスコアを設定し、タイマーを作っていきます。
2.スコアオブジェクトを作成する
次に/scoreboardコマンドを使い、スコアオブジェクトというのを作成していきます。
このスコアオブジェクトでタイマーの時間を管理し、表示していきます。
次の3つのコマンドを実行し、スコアオブジェクトを作成しましょう。
/scoreboard objectives add でスコアオブジェクトを作成するという宣言、
『timerdisplay』『timer』『tick』がそれぞれスコアオブジェクトの名前、
dummyがスコアオブジェクトの種類を示しています。
timedisplayだけ最後に『時間』と書かれてますが、次の項目で解説する『setdisplay』で表示した時の名前です。名前が2種類あって分かりづらいですが、とりあえず今は次の項目に進んで大丈夫です。
チャット欄にログが表示されれば成功です。
それぞれのスコアオブジェクトの役割を説明すると、『timer』、『tick』が計算用、『timerdisplay』が表示用となっています。
3.スコアオブジェクトを表示する
次にタイマーとして表示する『timerdisplay』を見えるように設定します。
次のコマンドを実行してください。
/scoreboard objectives setdisplay でスコアの表示するという宣言、
sidebarは表示場所、
timerdisplayは表示するスコアを示しています。
sidebarの項目は他に『list(プレイヤー一覧のところ)』と『belowname(名前の下)』がありますが、今回は常に見やすい『sidebar(画面右)』にします。
このコマンドを実行すると、右に『時間』という文字が表示されます。
これが先ほどの『setdisplay』で表示した時の名前です。
この名前は設定しなくても良いですが、setdisplayで表示する時は分かりやすい名前で設定しておいた方が良いですね。
4.コマンドブロックを入手する
次からはコマンドブロックを使ってコマンドを設定する必要があります。
コマンドブロックはコマンドを使うしか入手方法がありません。なので、次の3つのコマンドをチャットで実行してください。
5.防具立てにスコアオブジェクトを設定する
次にコマンドブロックを使って、先ほど作った防具立てにスコアオブジェクトを設定していきます。
画像のようにコマンドブロックを設置してください。色はもちろん、向きも大事なので注意です。矢印がコマンドブロックの方を向くように設置しましょう。
それぞれ1,2,3のコマンドブロックを開き、次のコマンドを入力してください。
timerの値を設定しています。1200の部分がタイマーの時間となり、計りたい秒数x20の値を入力しましょう。なぜx20するのかはまた後で解説します。
とりあえず今回は1200、つまり60秒にセットしました。
次に『timerdisplay』の値を設定します。先ほどと同じ値にします。今回の場合だと1200ですね。
最後に『tick』の値を20に設定します。この20は、先ほどのx20と関連していきます。
この3つのコマンドを分解すると次のようになります。
/scoreboard players set でスコアオブジェクトの値を設定する、という宣言、
@e[name=time] でスコアオブジェクトを設定する対象者、
『timer』『timerdisplay』『tick』で設定するスコアオブジェクトの名前、
1200、20がスコアオブジェクトの値になります。
@e[name=○○] で○○という名前のエンティティ(=動物やモンスター、防具立てなど)を対象とすることができます。
今回は@e[name=time]なので、『time』という名前のエンティティ、つまり先ほど名付けた防具立てのことですね。
では、コマンドを設定し終えたので、オレンジの衝撃コマンドブロックにボタンを付けて実行しましょう。
すると、右に1200と書かれた赤い数字が表示されます(白い数字は無視してください)。
ここまでのまとめ
防具立ての状態をまとめると、
- 名前は『time』
- 『timer』が1200
- 『timerdisplay』が1200で、右に表示されている
- 『tick』が20
という認識でOKです。
次からこの数字を変化させて、タイマーを作っていきます。
6.コマンドブロックを設置する
またコマンドブロックを設置していきます。
先ほど設置した場所とは少し離れた場所に設置しましょう。
では次に4~7のコマンドを入力していきます。
このコマンドでは防具立ての『timerdisplay』を『timer』と同じ値にしています。
コマンドを分解すると次のようになります。
/scoreboard players operation でスコアオブジェクトの計算をするという宣言、
@e[name=time] timerdisplay = @e[name=time] timer でtimeという名前のエンティティ(=防具立て)のtimerdisplayの値をtimerと同じ値にしています。
このコマンドも似たような形になってますね。
このコマンドでは防具立ての『timerdisplayの値』を『tick』の値、つまり20で割っています。
こちらのコマンドでは、『timer』の値を1だけ減らしています。
このコマンドを分解すると次のようになります。
/scoreboard players remove でスコアオブジェクトの値を減らす、という宣言、
@e[name=time,scores={timer=0..}]で対象者、
timerが減らすスコアオブジェクトで、1が減らす量になっています。
@e[name=time,scores={timer=0..}]と、見慣れない部分がありますね。
これはスコアオブジェクトのtimerが0以上かつ名前が『time』のエンティティ、ということになります。
つまり、timerの値が-1になるまで減らし続けるコマンドになっています。
最後は『timer』の値が0になった時、『FINISH!!』という文字を表示させるコマンドです。
timer=0の数字の部分を変えることで文字を表示させるタイミングを変えたり、FINISH!!の文字を変えることで表示する文字を変えることもできます。
レッドストーンブロックを置きタイマーを起動する
これでコマンド自体は完成です!反復コマンドブロック(青紫色)の隣にレッドストーンブロックを置くと起動します。
ちゃんと右の赤い数字が1秒につき1ずつ減っていくでしょうか?
また、チャット欄に文字が流れまくるので、消したい場合は次のコマンドを実行してください。
赤い数字が0になると『FINISH!!』の文字が表示されます。
もう一度タイマーを起動する時は、オレンジの方のコマンドブロックのボタンを押しましょう。
仕組みの解説
では、仕組みの解説をしていきます。
まずは防具立ての状態を振り返りましょう。
1~3のコマンドブロックを実行した結果、timeという名前の防具立てには3つのスコアオブジェクトが設定されており、それぞれtimer、timerdisplayが1200、tickが20でしたね。
その状態から、反復コマンドブロックを使って4~7のコマンドを実行をし続けています。
その流れを分かりやすく画像のしたのでご覧ください。
timerdisplayをtimerと同じ値にし(4)、それを20で割って右の枠に赤い数字として表示されます(5)。
そのあとtimerの値を1だけ減らし(6)、4のコマンドへ戻る・・・、というのを1秒間に20回繰り返していきます。
※2 計りたい秒数に20をかけた理由
反復コマンドブロックは1秒間に20回コマンドを繰り返し実行します。
ということはtimerの値を1だけ減らすコマンド(6)も1秒間に20回実行される、つまりtimerの値は1秒間に20も減るわけです。
それを見積もった上で、timerの値は計りたい時間に20をかける必要があったんですね。
※1 スコアオブジェクトの値は小数点以下切り捨て
そして、右の枠に表示させる時は『秒』に直したいわけです。
ですが、timerの値は20倍されている・・・、ということは20で再び割れば良いわけです。
そこで、timerの値をtimerdisplayにコピーし(4)、timerdisplayの値を20で割れば(5)、元の秒数として表示できるということですね。
また、スコアの値は小数点以下は切り捨てです。なので、timerが1199の時、20で割ると59.95になりますが、切り捨てて59になるわけです。
timerの値が0の時、FINISH!!が表示される
で、6のコマンドが実行され続けてtimerの値が0になった時、titleコマンドを使って『FINISH!!』が表示されます。
その後ふたたび/scoreboard players setでtimerの値を設定すれば、再起動できます。
まとめ
以上、BE版scoreboard式タイマーの解説でした。
今回は基礎的な部分しか作りませんでしたが、タイマーが終わったら効果音を鳴らす(playsoundコマンド)、とか様々な工夫をしてみるのも良いですね。
scoreboardは複雑なコマンドのため、難しく感じたかもしれません。
ですが、使いこなせばとても便利で楽しいコマンドでもあります。BEはまだdummyスコアしか扱えないけど・・・。
最後に、この記事に関する質問をするので、お時間がある方はお答えください。
tellrawコマンドがあれば、もっとスマートに時間を表示できるんですけどね・・・。JSONテキストは使えないのでしょうか?