ルッキーのコマンドメモ

主にマイクラのコマンドやデータパックに関することを書いていきます。

(マイクラ コマンド・データパック) 視線の先にいるモブやエンティティを調べる方法

視線の先にいるモブやエンティティを調べる

今回は視線の先にエンティティがいるかを調べてそのエンティティに対してコマンドを実行する方法を紹介します。

目次

調べるコマンド

再帰呼び出しと呼ばれる方法を使い、プレイヤの視線の方向に少しづつ検知用のエンティティをとばし、そのエンティティに触れたエンティティが視線先にいると判断しています。

再帰呼び出しについてはこちらでも紹介しています。

実装例は以下のようになります。

check.mcfunction

# 検知用にタグのついたmarkerを召喚する
execute at @s anchored eyes run summon marker ~ ~ ~ {Tags:["marker"]}

# マーカーの向きを実行者の視線の方向にする
execute at @s anchored eyes run data modify entity @e[tag=marker,sort=nearest,limit=1] Rotation set from entity @s Rotation

# ループ用のカウントを設定する
scoreboard players set count test 0
scoreboard players set loop test 50

#実行者を検知してしまわないようにtagをつけておく
tag @s add executer

# 再帰呼び出しにより視線先のエンティティを探す
execute at @s anchored eyes positioned ^ ^ ^ as @e[tag=marker,sort=nearest,limit=1] if score count test < loop test run function <名前空間>:check_loop

# 検知用のmarkerをkill
kill @e[type=marker,tag=marker]

# つけたtagを消す
tag @e[tag=executer] remove executer

# 検知したエンティティに発光エフェクトをつける
effect give @e[tag=detected] glowing 1 1

# 検知したエンティティからタグを消去する
tag @e[tag=detected] remove detected

# スコアをリセットする
scoreboard players reset count test
scoreboard players reset loop test

check_loop.mcfunction

# 検知用エンティティを視線先に0.1ブロックtpさせる
tp @s ^ ^ ^0.1

# 検知用エンティティを中心とした0.01×0.01×0.01の立方体の中に当たり判定があるエンティティにdetectedタグをつける
execute at @s positioned ~0 ~0 ~0 as @e[tag=!marker,tag=!executer,dx=0] positioned ~-0.99 ~-0.99 ~-0.99 if entity @s[dx=0] run tag @s add detected

# ループ処理。 detectedタグがついたエンティティがいなければ継続する
scoreboard players add count test 1
execute unless entity @e[tag=detected] at @s if score count test < loop test run function <名前空間>:check_loop

実行結果

このコマンドを毎tick実行してみるこのような結果になります。

実行結果 (見つかった場合)

視線の先にエンティティの当たり判定があれば検知され発光します

実行結果 (見つからなかった場合)

当たり判定がなければ検知されず、発光しません。

解説

行っていることは以下のようになります。

  1. 実行者の頭の位置に検知用エンティティとしてmarkerを召喚し、markerの視線の方向を実行者と同じにする。
    check.mcfunctionの最初の2つのコマンドの部分になります。

  2. ループ回数を設定し、ループ用関数を呼び出す。
    3から6番目のコマンドが該当します。

  3. 各ループにおいて、0.1ブロックずつ視線の方向にmarkerを移動させ、エンティティがいるか調べる
    セレクタの引数であるdxを利用してエンティティの座標ではなく当たり判定を基準として存在を調べています。dxについての詳細はdx,dy,dzの使い方を確認してください

  4. エンティティが見つからなければ3に戻る

  5. もし、エンティティが見つかればdetectedタグをつけてループを終了する

  6. detectedタグがついたエンティティを発光させる

まとめ

このように、再帰呼び出しを利用することにより、視線先にいるエンティティを検知することができます。