マルチプレイなら『シン・VPS』がおすすめ!

【必見!】視線検知でコマンドを実行するには再帰が必要【マイクラ】

【必見!】視線検知でコマンドを実行するには再帰が必要【マイクラ】

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

視線で検知したいマインクラフター
「特定のmobを見た時にコマンドを実行されるようにする方法を知りたいな。どんなコマンドを使えばいいんだろう?」

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

本記事の内容
  • 視線検知でコマンドを実行するには再帰が必要

こんにちは! マインクラフターのなつめ(@natsume_717b)です。

なつめ

マイクラ歴は5年程で、最近は脱出マップやミニゲームを制作しています!
→ダウンロードページ

この記事では、mobやプレイヤーを見た時にコマンドを実行する方法について解説していきます。

何かを見た時にコマンドを実行するには再帰という仕組みを利用する必要があり、そのためにfunctionコマンドを使います。
つまり、データパックの作成が必要というわけです。

今回は実行されるコマンドに重点を置いてお話していきますので、データパックやfunctionについてはコマンドをまとめて負荷軽減!functionコマンドの準備とやり方解説!【Java版】を参考にしてください。

それでは、さっそく見ていきましょう!



視線検知でコマンドを実行するには再帰が必要

「mobを見た時にコマンドを実行する」ということをやるには、再帰というものを理解しておく必要があります。

マイクラの場合、functionコマンドを実行して、その実行したfunctionによって再び同じfunctionを実行することを再帰と言います。

再帰とは元々プログラミングの用語で、プログラミングの場合は関数で同じ関数を呼び起こすことを指しています。

要はfunctionを実行することで、延々と同一のfunctionを実行し続けることですね。
実際に使用する際は、無限に処理されないように条件を満たしているかどうかで繰り返されるのかどうかを指示します。

「mobを見た時にコマンドを実行する」の説明とコマンド

さて、「mobを見た時にコマンドを実行する」ということに話を戻します。

これを再現したい場合は視線の位置から真っすぐ伸ばし、指定したmobが伸ばした線上にいた場合にコマンドを実行すればOKと言えそうです。

そのため、視線の位置をコマンドの実行場所とします。
そうして少しずつ真っすぐ前にコマンドの実行場所を移動していき、コマンドの実行場所から1マス以内に指定したmobがいたらコマンドが実行されるようにします。

というわけで、.mcfunctionファイルに以下のように書き込みます。

execute if entity @e[type=pig,distance=..1] run give @s diamond 1
execute unless entity @e[type=pig,distance=..1] if entity @s[distance=..30] positioned ^ ^ ^1 if block ^ ^ ^ air run function recrusion:01_saiki

.mcfunctionファイルを作る必要があるため、作り方が分からないという方はコマンドをまとめて負荷軽減!functionコマンドの準備とやり方解説!【Java版】をご覧ください。

2つのexecuteコマンドが書かれており、上のコマンドは指定したmobを見た時に実行されるコマンド。
下のコマンドは再帰するため(繰り返すため)のコマンドとなっております。

今回はブタを見た時にコマンドを実行されるようにしましたので、詳しく見ていきましょう。

ブタを見た時に実行されるコマンド

execute if entity @e[type=pig,distance=..1] run give @s diamond 1

1つ目のコマンドです。
これはコマンドの実行場所から1マス以内にブタがいたら、コマンドの実行者にダイヤモンドを1つ付与するコマンドとなっております。

コマンドの実行場所は、2つ目のコマンドによって少しずつ目線の先へと移動しています。

再帰するためのコマンド

execute unless entity @e[type=pig,distance=..1] if entity @s[distance=..30] positioned ^ ^ ^1 if block ^ ^ ^ air run function recrusion:01_saiki

さて、2つ目のコマンドです。
まず初めにunless entity @e[type=pig,distance=..1]によって、コマンドの実行場所から1マス以内にブタがいなかったらこのコマンドを実行するように指示しています。

そしてif entity @s[distance=..30]で、コマンドを実行場所から30マス以内にコマンドの実行者がいたらコマンドを実行するようにも指示しています。
これはブタが視線上に永遠に存在しない場合の考慮です。
(この部分がないと、ブタを確認できなかった場合に延々と再帰し続けます)

次にpositioned ^ ^ ^1で目線の1マス先にコマンドの実行場所を移します。
これがあることで、再帰する度に1マス先の場所がコマンドの実行場所となります。

if block ^ ^ ^ airの部分は、コマンドの実行場所を1マス先に移動した座標が空気ブロックである場合にコマンドを実行するように指示しています。
要するに、ブロックなどで壁があった際に突き抜けて処理しないためのものです。
壁越しにブタを見た場合にどのように処理するのかという項目だと思ってください。

ようやっと最後の箇所です。
run function recrusion:01_saikiで同一のfunctionを呼ぶことで再帰をします。
今回はrecrusion:01_saikiという参照をしていますが、これは各自functionを作った際のファイル名などを参照してください。

というわけでまとめると、コマンドの実行場所から1マス以内にブタがおらず、30マス以内にコマンドの実行者がおり、視線の1マス先にコマンドの実行場所を移動したうえでその場所が空気である場合にrecrusion:01_saikiというfunctionを実行するよ(再帰するよ)と言っています。

コマンドの実行場所から1マス以内にブタがいると、コマンドの実行者にダイヤモンドを付与して再帰することがなくなります。

再帰するために実行するコマンド

再帰するために、1番初めに実行するコマンドは以下の通りです。

execute as @a at @s anchored eyes run function recrusion:01_saiki

全てのプレイヤーがそれぞれの場所で目線の高さを基にfunctionを実行するコマンドとなっています。

基本的にはリピートして、常に実行されている状態にすることが多いです。
ここまでの内容を理解している方の場合は、functionを扱える方ですのでtick.jsonに書き込んでリピートするのがおすすめです。

まとめ

というわけで、今回のまとめです。

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

今回使ったコマンド
  • ブタを見た時にダイヤモンドを貰うための.mcfunctionファイルの中身
    (再帰するようにしています)
execute if entity @e[type=pig,distance=..1] run give @s diamond 1
execute unless entity @e[type=pig,distance=..1] if entity @s[distance=..30] positioned ^ ^ ^1 if block ^ ^ ^ air run function recrusion:01_saiki
  • 上記のfunctionファイルを呼び出すためのコマンド
    (再帰し始めるために必要なコマンド)
execute as @a at @s anchored eyes run function recrusion:01_saiki
ポイント
  • mobやプレイヤーを視認した時コマンドを実行するには、再帰を利用する必要があります。

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

  • 【まとめ】functionコマンドの基本から応用【マイクラ】
  • 【まとめ】カスタムストラクチャーの実装・カスタム方法【マイクラ】