(マイクラ コマンド・データパック) 視線の先にいるモブやエンティティを調べる方法
視線の先にいるモブやエンティティを調べる
今回は視線の先にエンティティがいるかを調べてそのエンティティに対してコマンドを実行する方法を紹介します。
目次
調べるコマンド
再帰呼び出しと呼ばれる方法を使い、プレイヤの視線の方向に少しづつ検知用のエンティティをとばし、そのエンティティに触れたエンティティが視線先にいると判断しています。
実装例は以下のようになります。
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実行してみるこのような結果になります。
視線の先にエンティティの当たり判定があれば検知され発光します
当たり判定がなければ検知されず、発光しません。
解説
行っていることは以下のようになります。
実行者の頭の位置に検知用エンティティとしてmarkerを召喚し、markerの視線の方向を実行者と同じにする。
check.mcfunction
の最初の2つのコマンドの部分になります。ループ回数を設定し、ループ用関数を呼び出す。
3から6番目のコマンドが該当します。各ループにおいて、0.1ブロックずつ視線の方向にmarkerを移動させ、エンティティがいるか調べる
セレクタの引数であるdxを利用してエンティティの座標ではなく当たり判定を基準として存在を調べています。dxについての詳細はdx,dy,dzの使い方を確認してくださいエンティティが見つからなければ3に戻る
もし、エンティティが見つかればdetectedタグをつけてループを終了する
detectedタグがついたエンティティを発光させる
まとめ
このように、再帰呼び出しを利用することにより、視線先にいるエンティティを検知することができます。