視線検知コマンド【Minecraftコマンド技法】

視線検知コマンド【Minecraftコマンド技法】

目的:視線先のモブ、ブロックの検知
執筆時環境:Minecraft ver.1.16.5

スポンサーリンク




はじめに

Minecraftのデータパックのためのコマンド紹介です。

公式Wikiのチュートリアルをある程度理解している脱初心者~中級者向けの内容となっております。

初心者向けの解説はそのうち、気が向いたらになると思います。

データパックがわからない方はブラウザバック推奨。

では初めて行きましょう。

視線検知

原理さえわかってしまえば意外と簡単、それでもなかなか直ぐに上手くいかないのが視線検知。

何はともあれ関数(function)を記述しよう

今回の例はtest:beamという関数を作成しました。

関数は次のコマンドを記述します。

particle minecraft:barrier ~ ~ ~ 0 0 0 0 0
execute if entity @s[distance=..40] positioned ^ ^ ^1 if block ~ ~ ~ air run function test:beam

ゲーム内で実行する

実行には次の文章をチャット欄に打ち込みます。

/function test:beam

これをMinecraft内で実行するとこうなります。

関数には二個しか記述していないのに実行数が125個になっているのがわかるでしょうか?

順番に紐解いていくと、

if entity @s[distance=..40]

もし(if entity)コマンド実行者(@s)が40メートル以内にいる(distance=..40)ならコマンドを実行

positioned ^ ^ ^1

実行位置(positioned)は視線方向に1m進んだ場所(^ ^ ^1)

if block ~ ~ ~ air

実行した位置が空気であるならコマンドを実行

run function test:beam

test:beamのコマンドを実行

particle minecraft:barrier ~ ~ ~ 0 0 0 0 0

バリアブロックのパーティクルを表示してコマンドの実行を視覚的にわかりやすくする

なくてもいいです(実際に何かする場合はコメントで消す)

以上となり、最後に自分を呼び出すことでループさせることで視線方向に向かって延々とコマンド実行します。今回は実行者から40m以内を条件としているため、40m離れたところでコマンドの実行が停止するわけです。

また、if block ~ ~ ~airを指定しているので、ブロックの壁にぶつかると視線は止まります。

で、このままでは目線の位置で実行されていません。

コマンド側に書くこともできますが、それはそれで処理が複雑になるので、ゲーム内や他の関数から呼び出すときにあらかじめ指定しておくと楽です。

少しコマンドが複雑になりますが、こちらです。

/execute positioned ~ ~1.4 ~ run function test:beam

あとは範囲内にブロックがあるか、エンティティがいるかさえ検知してしまえばいろんな応用が利きます。

3/21 追記

コメント欄でアドバイスいただきました。anchoredサブコマンドで実行すると目線の位置で実行ができます。プレイヤー以外で実行する場合こちらの方が楽です。

/execute anchored eyes positioned ^ ^ ^ run function test:beam

効果は同じです。

応用例:視線の先のモブの位置にテレポート

記述するコマンドはこちらです。

ファイル名は変わらずbeam.mcfunction。

particle minecraft:barrier ~ ~ ~ 0 0 0 0 0
execute if entity @e[type=shulker,distance=..0.5] run tp @s ~ ~ ~
execute unless entity @e[type=shulker,distance=..0.5] if entity @s[distance=..40] positioned ^ ^ ^1 if block ~ ~ ~ air run function test:beam

最後の文章に追記したのがこの文章

unless entity @e[type=shulker,distance=..0.5]

もし0.5m以内に(distance=..0.5)シュルカー(type=shulker)がいないなら(unless entity @e)コマンドを実行する

そして増えたコマンドがこちら

execute if entity @e[type=shulker,distance=..0.5] run tp @s ~ ~ ~

実行位置から0.5m以内にシュルカーがいるなら実行者を実行位置にテレポート

実行するとこんな感じ

シュルカーであることに深い意味はないので、どのエンティティでも構いません。

追加すべきことは、視線先にいてほしいエンティティのifとunlessをそれぞれ記述してあげること。これさえ守ればかなり応用が利きますよ。

まとめ

海外はさておき、日本語でのこの手の解説が少ないので備忘録的に用意しました。

質問・意見などあれば答えられる範囲で返答いたしますのでこちらのコメント欄にどうぞ。

スポンサーリンク




コメント

  1. 匿名 より:

    目線の位置で実行するためのコマンドで
    /execute positioned ~ ~1.4 ~ run function test:beam
    と紹介してますが
    /execute anchored eyes positioned ^ ^ ^ run function test:beam
    のようにするとMobの大きさに左右されないと思います。

    • より:

      コメントありがとうございます。
      プレイヤーが実行する前提なら上記の方が軽いのでこちらにしておりました。(ただしほんのわずかな差です)
      私自身他MOBで実行することを念頭に入れておりませんでした。追記しておきます。