【Java版】コマンドでメッセージを表示する方法【長文もOK】

【Java版】コマンドでメッセージを表示する方法【長文もOK】

この記事では、Minecraft Java Edition(バージョン1.17)の情報をもとに執筆しています。
そのほかのバージョンや機種などでの動作は保証できません。

コマンド初心者なマインクラフター
「コマンドでメッセージを出したいんだけど、何のコマンドを使えばいいの?」

こんな疑問を解決します!

本記事の内容
  • メッセージを出すには、tellrawコマンド
  • 複数行のメッセージを出す場合

こんにちは! マインクラフターのナツメ(@natsume_717b)です。

ナツメってこんな人

今回はメッセージを表示するコマンドについて解説していきます。

文章の長さでコマンドの組み方を変えるべき理由や、徐々にメッセージを表示させる方法についても解説しているので、この記事を読めばほとんどメッセージを表示する方法については網羅できると思います。

という訳で、さっそく見ていきましょう!

メッセージを出すには、tellrawコマンド

メッセージを出すにはtellrawコマンドが適しています。
というのも、tellrawコマンドは余計な文面が付かないからです。

メッセージを表示するコマンドは幾つかありますが、tellrawコマンド以外の例を出すとsayコマンド、tellコマンドなどがあります。

それぞれ以下のような欠点があります。

  • sayコマンド→コマンドを実行したプレイヤーのIDが表記される。
  • tellコマンド→「実行者にささやかれました」と表記される。

その一方で、先ほども言ったようにtellrawコマンドは入力した文章がそのままメッセージとして表示されます。

なので、メッセージを表示させるにはtellrawコマンドが適しているわけです。

コマンドの書き方としては

/tellraw 対象 "表示させたい文章"

とシンプルなものです。

基本的に全員に表示させるものなので、対象の部分は@aになるかと思います。
もちろん、状況に応じて対象は変更してくださいね。

ただコマンドでメッセージを出す場合は、改行ができません
なので文を跨ぐ場合には別のコマンドブロックを用意する必要があります。

その場合はチェーンコマンドブロックで繋ぐか、コンパレーターとリピーターで繋ぐ必要があります。

チェーンコマンドブロックを使うときは向きの重要ですので、若干暗くなって見づらいですが画像の通りに設置する必要があります。

チェーンコマンドブロックを使うときは向きの重要ですので、若干暗くなって見づらいですが画像の通りに設置する必要があります。

リピーターとコンパレーターを使う場合には、コンパレーターからしか赤石信号が取り出せないことに注意しておきましょう。

リピーターとコンパレーターを使う場合には、コンパレーターからしか赤石信号が取り出せないことに注意しておきましょう。

ちなみにこの2つの違いとしては、一瞬ですべての文章を出すか、少しずつ遅延を挟みながら文章を表示させることが挙げられます。

というわけで、メッセージを表示させるにはtellrawコマンドを使えばOKです。

複数行のメッセージを出す場合

さて、tellrawコマンドで文章を出すことは分かりました。
そして改行ができないので、他のアイテムやコマンドブロックをチェーンの状態にするなどの解決方法があることもお話しました。

しかし、2,3行で収まらない文章を遅延を挟みつつ表示させたい場合はとんでもない広さを用意してコンパレーターとリピーターを並べなくてはなりません。

そんなことは愚の骨頂です。
せっかく省スペースで色々出来るコマンドブロックを使っているのに、そんな手間がかかる上にスペースを取ることはしたくありません。

というわけで、Scoreboardコマンドと組み合わせていきます。
簡単にどんなことをしていくのかを説明していくと

  1. 文章を表示させたいタイミングをexecuteコマンドで感知。
    →ゲーム内時間の進行を数えるスコアボードを作成する。
  2. あらかじめ作っていたコマンドブロックでスコアボードの数値が指定した数値になったのを機にtellrawコマンドを作動させる。
  3. 表示させたい文章をすべて表示し終えたら、スコアボードを削除して誤作動を起こさないようにする。

といった感じです。
少し難しいので、それぞれの項目を詳しく解説していきます。

①文章を表示させたいタイミングをexecuteコマンドで感知。

まずは文章を表示させたいタイミングを感知します。
そのタイミングで、スコアボードを作成するということになります。

例えば、今回は座標X=0、Y=0、Z=0の地点を通った時と仮定しましょう。
その場合executeコマンドで感知しようとすると、

/execute if entity @p[x=0,y=0,z=0,dx=0,dy=0,dz=0]

となります。

そして、時間経過をはかるスコアボードを作成しますので、

scoreboard objectives add XXXX minecraft.custom:minecraft.play_time

を組み込みます。
XXXXの部分は好きな文字列で大丈夫です。

この部分はスコアボードの名称となるわけですので、今回は分かりやすく「talk01」と名付けておくことにします。

因みに、minecraft.custom:minecraft.play_timeの部分が経過時間をはかることを示しています。
という訳で組み合わせてみると以下のようなコマンドになります。

/execute if entity @p[x=0,y=0,z=0,dx=0,dy=0,dz=0] run scoreboard objectives add talk01 minecraft.custom:minecraft.play_time

このコマンドを常時実行にしているリピートコマンドブロックに入れておきます。
これで座標X=0、Y=0、Z=0の地点を通った時に、talk01という時間の経過をはかるスコアボードが作成されます。

②あらかじめ作っていたコマンドブロックでスコアボードの数値が指定した数値になったのを機にtellrawコマンドを作動させる

①の作業をしたことで、座標X=0、Y=0、Z=0の地点を通った時点でスコアボードが作成され勝手にカウントが進んでいくようになりました。
次はスコアボードの値が指定した数値になった時にtellrawコマンドが作動するようにします。

というわけで使うコマンドはまたまたexecuteコマンドです。
本当に便利ですね。

今回は特定の値のスコアボードを持っているプレイヤーを感知します。
なので、以下のようなコマンドになります。

execute if entity @p[scores={talk01=30}] run tellraw @a "aiueo"

上記のコマンドは「talk01」の値が30になった時に「tellraw @a “aiueo”」を起動するものです。

なので、座標X=0、Y=0、Z=0の地点を通って少しした後にチャット欄に「aiueo」と表示されます。

minecraft.custom:minecraft.play_timeは1秒に1カウントされるわけではありません。
(マイクラ内での時間換算ですので、20tickで1秒になります。上述の30なら1.5秒ですね)

このコマンドを基本に30の部分とtellrawコマンドで表示する内容を変更すれば、自在にタイミングと表示内容をいじれます。

つまり、表示したい文章の数だけリピートコマンドブロックを用意して、スコアの値を表示順に増やしていけばOKです。

実際に私が作った配布マップには、以下のようなコマンドブロックが置かれています。

execute if entity @a[scores={timecheck000=20}] run tellraw @a "これは過去の話だ"
execute if entity @a[scores={timecheck000=60}] run tellraw @a "私が体験した昔話"
execute if entity @a[scores={timecheck000=120}] run tellraw @a "数年経った今でも現実味がなかったが"

と、あまりに多く並べてもややこしいだけですので「上記の3つでこんな感じだよー」というのが分かっていただけたらなと思います。

ちなみに計測しているスコアボードの名称は「timecheck000」となっています。

また、スコアの間隔は基本的に60程度が良いですね。

文章が長かったり、発言者がいて困惑など反応に困っている様子を表現したいなら80。
逆に文章が短かったり、勢いを表現したいなら40とか50でもいいと思います。

そのあたりは個人個人で調整してみてください。

因みに宣伝になってしまいますが、上記のコマンドは【ワールド配布】行末【脱出マップ】から抜き取りましたので、気になる方はぜひ遊んでみてくださいね。

③表示させたい文章をすべて表示し終えたら、スコアボードを削除して誤作動を起こさないようにする。

最後に大事なのが、スコアボードを消す作業。
それに付随して、状況に応じてスコアボードを作成するコマンドを消しておくことも重要です。

まずはスコアボードを削除する理由についてお話しましょう。
今回の場合は「talk01」というスコアボードにしているので、

/scoreboard objectives remove talk01

というコマンドを使います。

そしてこのコマンドを使う際は、メッセージの表示が終わったことを機に作動するようにしておくと楽です。

例えば、tellrawコマンドと組み合わせた時と同じように、スコアボードの値が特定の数値に到達した時に作動するようにしてもいいですし、最後の文章を表示するtellrawコマンドが含まれているリピートコマンドブロックに、チェーンコマンドブロックで繋げてもいいと思います。

例:talk01のスコアが100に到達した時点で自動でtalk01のスコアボードを消すコマンド

execute if entity @p[scores={talk01=100}] run scoreboard objectives remove talk01

なぜこんなことをするのかというと、単純に自分が作業しやすくするためです。
あとはマイクラが重くならないように……など。

正直削除しておく必要もないのですが、削除まで自動でやってくれると配布前に確認しなくて済みます。

既に同名のスコアボードが存在すると、executeコマンドで指定した条件を満たしてもそのスコアボードは作成されません。
→スコアボードが作成されないと、スコアの値で作動するかどうかを決めているtellrawコマンドが正常に動作してくれません。

また、状況に応じてスコアボードを作成するコマンドを消しておく理由についてですが、何度も起動しないようにしておく場合があるからです。

RPGの村人のように何回も話せるものならば問題ありませんが、一回限りの会話にしたい場合はスコアボードを作成しているコマンドブロックを消す必要があります。

スコアボードを消したとしても再び条件を満たしてスコアボードの計測が始まってしまう場合があるってことですね。
それの阻止です。

コマンドブロックを消すのはsetblockコマンドでairを指定すれば問題ありません。


というわけで、複数行に跨るメッセージを表示させる場合のおすすめの方法をお教えしました。

まとめ

今回のまとめです。

今回使ったコマンドはこちら。

今回使ったコマンド
  • メッセージを表示させるコマンド
/tellraw 対象 "表示させたい文章"
ポイント
  • 文章量に応じて、コマンドの組み方を変えるのがコツです!

この記事は以上になります。







この記事を共有!