パイセンのマイクラ攻略教室

マインクラフトのコマンドについて解説していくブログです。エトセトラパーティーというグループでコマンド紹介動画も投稿しています。

【マイクラBE】scoreboardコマンドでタイマーを作ろう

どうも!パイセンです。

今回はBE(スマホ・switch・win10等)でもできるscoreboard式タイマーの作り方を紹介します。

とてもシンプルなので、scoreboard入門としても良いコマンドなのではないでしょうか?

では早速作っていきます。

完成品はこんな感じ(動画)

完成品はこのようになっています。

右の赤い数字がタイマーです。


白い数字はおそらくmob一体一体を区別するIDのようなものだと思われます。(BEにはあまり詳しくないので、違ったらコメントでご指摘ください・・・。)


作り方

1.タイマーの時間を管理するための防具立てを設置
f:id:hollys-command-lecture:20181103205241j:plain

まずはタイマーの時間を管理するための防具立てを設置します。

防具立てを置き、『time』という名札で名前を付けましょう。この防具立てに/scoreboardコマンドを使ってスコアを設定し、タイマーを作っていきます。


2.スコアオブジェクトを作成する

次に/scoreboardコマンドを使い、スコアオブジェクトというのを作成していきます。

このスコアオブジェクトでタイマーの時間を管理し、表示していきます。

次の3つのコマンドを実行し、スコアオブジェクトを作成しましょう。

チャットで実行/scoreboard objectives add timerdisplay dummy 時間


チャットで実行/scoreboard objectives add timer dummy


チャットで実行/scoreboard objectives add tick dummy


/scoreboard objectives add でスコアオブジェクトを作成するという宣言
『timerdisplay』『timer』『tick』がそれぞれスコアオブジェクトの名前
dummyがスコアオブジェクトの種類を示しています。

timedisplayだけ最後に『時間』と書かれてますが、次の項目で解説する『setdisplay』で表示した時の名前です。名前が2種類あって分かりづらいですが、とりあえず今は次の項目に進んで大丈夫です。


f:id:hollys-command-lecture:20181103205219j:plain

チャット欄にログが表示されれば成功です。

それぞれのスコアオブジェクトの役割を説明すると、『timer』、『tick』が計算用、『timerdisplay』が表示用となっています。


3.スコアオブジェクトを表示する

次にタイマーとして表示する『timerdisplay』を見えるように設定します。

次のコマンドを実行してください。

チャットで実行/scoreboard objectives setdisplay sidebar timerdisplay

/scoreboard objectives setdisplay でスコアの表示するという宣言
sidebarは表示場所
timerdisplayは表示するスコアを示しています。

sidebarの項目は他に『list(プレイヤー一覧のところ)』と『belowname(名前の下)』がありますが、今回は常に見やすい『sidebar(画面右)』にします。


f:id:hollys-command-lecture:20181103205212j:plain

このコマンドを実行すると、右に『時間』という文字が表示されます。

これが先ほどの『setdisplay』で表示した時の名前です。

この名前は設定しなくても良いですが、setdisplayで表示する時は分かりやすい名前で設定しておいた方が良いですね。


4.コマンドブロックを入手する

次からはコマンドブロックを使ってコマンドを設定する必要があります。

コマンドブロックはコマンドを使うしか入手方法がありません。なので、次の3つのコマンドをチャットで実行してください。

チャットで実行/give @p command_block


チャットで実行/give @p chain_command_block


チャットで実行/give @p repeating_command_block


f:id:hollys-command-lecture:20181103205644j:plain


5.防具立てにスコアオブジェクトを設定する

次にコマンドブロックを使って、先ほど作った防具立てにスコアオブジェクトを設定していきます。

画像のようにコマンドブロックを設置してください。色はもちろん、向きも大事なので注意です。矢印がコマンドブロックの方を向くように設置しましょう。

f:id:hollys-command-lecture:20181103210408j:plain


それぞれ1,2,3のコマンドブロックを開き、次のコマンドを入力してください。

①・衝撃・無条件・レッドストーンが必要/scoreboard players set @e[name=time] timer 1200

f:id:hollys-command-lecture:20181103210712j:plain


timerの値を設定しています。1200の部分がタイマーの時間となり、計りたい秒数x20の値を入力しましょう。なぜx20するのかはまた後で解説します。

とりあえず今回は1200、つまり60秒にセットしました。


②・チェーン・無条件・常にアクティブ/scoreboard players set @e[name=time] timerdisplay 1200

f:id:hollys-command-lecture:20181103211256j:plain


次に『timerdisplay』の値を設定します。先ほどと同じ値にします。今回の場合だと1200ですね。


③・チェーン・無条件・常にアクティブ/scoreboard players set @e[name=time] tick 20

f:id:hollys-command-lecture:20181103211358j:plain


最後に『tick』の値を20に設定します。この20は、先ほどのx20と関連していきます。


この3つのコマンドを分解すると次のようになります。

/scoreboard players set でスコアオブジェクトの値を設定する、という宣言、
@e[name=time] でスコアオブジェクトを設定する対象者
『timer』『timerdisplay』『tick』で設定するスコアオブジェクトの名前
1200、20がスコアオブジェクトの値
になります。

@e[name=○○] で○○という名前のエンティティ(=動物やモンスター、防具立てなど)を対象とすることができます。

今回は@e[name=time]なので、『time』という名前のエンティティ、つまり先ほど名付けた防具立てのことですね。


では、コマンドを設定し終えたので、オレンジの衝撃コマンドブロックにボタンを付けて実行しましょう。

すると、右に1200と書かれた赤い数字が表示されます(白い数字は無視してください)。

f:id:hollys-command-lecture:20181103212244j:plain


ここまでのまとめ

防具立ての状態をまとめると、

  • 名前は『time』
  • 『timer』が1200
  • 『timerdisplay』が1200で、右に表示されている
  • 『tick』が20

という認識でOKです。

次からこの数字を変化させて、タイマーを作っていきます。

f:id:hollys-command-lecture:20181103212141j:plain
スポンサーリンク


6.コマンドブロックを設置する

またコマンドブロックを設置していきます。

先ほど設置した場所とは少し離れた場所に設置しましょう。

f:id:hollys-command-lecture:20181103212930j:plain


では次に4~7のコマンドを入力していきます。


④・反復・無条件・レッドストーンが必要/scoreboard players operation @e[name=time] timerdisplay = @e[name=time] timer

f:id:hollys-command-lecture:20181103213709j:plain


このコマンドでは防具立ての『timerdisplay』を『timer』と同じ値にしています。

コマンドを分解すると次のようになります。

/scoreboard players operation でスコアオブジェクトの計算をするという宣言、
@e[name=time] timerdisplay = @e[name=time] timer でtimeという名前のエンティティ(=防具立て)のtimerdisplayの値をtimerと同じ値にしています。


⑤・チェーン・無条件・常にアクティブ/scoreboard players operation @e[name=time] timerdisplay /= @e[name=time] tick

f:id:hollys-command-lecture:20181103213720j:plain


このコマンドも似たような形になってますね。

このコマンドでは防具立ての『timerdisplayの値』を『tick』の値、つまり20で割っています。


⑥・チェーン・無条件・常にアクティブ/scoreboard players remove @e[name=time,scores={timer=0..}] timer 1

f:id:hollys-command-lecture:20181103213737j:plain


こちらのコマンドでは、『timer』の値を1だけ減らしています。

このコマンドを分解すると次のようになります。

/scoreboard players remove でスコアオブジェクトの値を減らす、という宣言、
@e[name=time,scores={timer=0..}]で対象者
timerが減らすスコアオブジェクトで、1が減らす量になっています。


@e[name=time,scores={timer=0..}]と、見慣れない部分がありますね。

これはスコアオブジェクトのtimerが0以上かつ名前が『time』のエンティティ、ということになります。

つまり、timerの値が-1になるまで減らし続けるコマンドになっています。


⑦・チェーン・無条件・常にアクティブ/execute @e[scores={timer=0}] ~ ~ ~ title @a title FINISH!!

f:id:hollys-command-lecture:20181103213744j:plain


最後は『timer』の値が0になった時、『FINISH!!』という文字を表示させるコマンドです。

timer=0の数字の部分を変えることで文字を表示させるタイミングを変えたり、FINISH!!の文字を変えることで表示する文字を変えることもできます。


レッドストーンブロックを置きタイマーを起動する

これでコマンド自体は完成です!反復コマンドブロック(青紫色)の隣にレッドストーンブロックを置くと起動します。

f:id:hollys-command-lecture:20181103220028j:plain

ちゃんと右の赤い数字が1秒につき1ずつ減っていくでしょうか?


また、チャット欄に文字が流れまくるので、消したい場合は次のコマンドを実行してください。

チャットで実行/gamerule commandBlockOutput false

f:id:hollys-command-lecture:20181103220259j:plain


赤い数字が0になると『FINISH!!』の文字が表示されます。

f:id:hollys-command-lecture:20181103220443j:plain


もう一度タイマーを起動する時は、オレンジの方のコマンドブロックのボタンを押しましょう。

スポンサーリンク


仕組みの解説

では、仕組みの解説をしていきます。

まずは防具立ての状態を振り返りましょう。

1~3のコマンドブロックを実行した結果、timeという名前の防具立てには3つのスコアオブジェクトが設定されており、それぞれtimer、timerdisplayが1200tickが20でしたね。

f:id:hollys-command-lecture:20181103212141j:plain


その状態から、反復コマンドブロックを使って4~7のコマンドを実行をし続けています。

その流れを分かりやすく画像のしたのでご覧ください。

f:id:hollys-command-lecture:20181103220547j:plain

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スコアしか扱えないけど・・・。


最後に、この記事に関する質問をするので、お時間がある方はお答えください。


f:id:hollys-command-lecture:20180628111736p:plain

tellrawコマンドがあれば、もっとスマートに時間を表示できるんですけどね・・・。JSONテキストは使えないのでしょうか?