［UE5］距離が近くてインタラクト可能な向きにいるインタラクト対象に、インタラクトする

# 概要
この記事では、Unreal Engine 5 で、下の動画のように、一定範囲内にいるインタラクト対象の中で、一番距離が近く、かつプレイヤーから見てインタラクト可能な向きにいるインタラクト対象にインタラクトできるようにします。

<iframe width="640" height="360" src="https://www.youtube.com/embed/JovqpQU8ufE" title="interact 2 1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


# この記事の主な対象者
- Blueprint（BP）の作り方の基礎を習得されている、初心者の方


# 事前準備
今回の記事は、私が過去に書いた下の記事の内容の続きとなっております。そのため、大変恐縮ですが、下の記事を読んでいただいた後に、今回の記事を読んでいただけると幸いです。

https://qiita.com/tuduru/items/5f7223f25b8e570751b1

何卒、よろしくお願いいたします。


# 一番近くのインタラクト対象にインタラクトする

最初に、ノードを組むにあたって必要とする変数を作成していきます。

まずは、一番近くのインタラクト対象を格納する用の変数を作成します。変数の型は、[過去の記事](https://qiita.com/tuduru/items/5f7223f25b8e570751b1)で作成した、インタラクト対象のアクタのベースとするアクタのBP「BP_InteractiveActor」にします。（今回の記事では、変数名を「InteractableActor」にします。）

![interactableactor2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/d8e260ca-5b4c-9f3b-43e8-0f5e737c207e.jpeg)

次に、一番近いインタラクト対象との距離を記憶しておくための変数を作成します。変数の型は「float」にします。（今回の記事では、変数名を「DistanceSquaredMin」にします。）

![distancesquredmin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/745ff13d-5469-0351-4e29-b26305ccd025.jpeg)

最後に、一番近くのインタラクト対象を調べる際に使用する、floatの最大値を入れる変数を作成します。デフォルト値には、「100000000000000000000…」と、とにかく大きい値を入力するようにします。（今回の記事では、変数名を「FloatMax」にします。）

![floatmax.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/b9d18f33-ae7d-1eb5-341b-0ce2551767d1.jpeg)<br><br>


必要な変数の作成が終わったら、渡されたインタラクト対象のアクタが、プレイヤーから一番近いアクタかどうかを見るための関数を作成します。

関数のインプットに、「BP_InteractiveActor」型の引数を持った関数を作成し、下図のノードを組みます。（今回の記事では、引数の名前を「InteractiveActor」という名前にし、関数名を「UpdateInteractable」）

![only_distance_graph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/6f44e2a0-025a-3218-039f-c6fbd29185fe.jpeg)<br><br>


次に、Tick毎に一番近くのインタラクト対象のアクタを調べ、そのインタラクト対象のアクタのインタラクトアイコンを表示するノードを組みます。

下図のノードを組みます。

![tick_interactive2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/22e138a0-e7c1-b96f-1048-d1437da88084.jpeg)<br><br>


次に、[過去の記事](https://qiita.com/tuduru/items/5f7223f25b8e570751b1)で作成した、プレイヤーのBPのイベントグラフの「OnComponentBeginOverlap」ノードを下図のように組み替えます。[過去の記事](https://qiita.com/tuduru/items/5f7223f25b8e570751b1)の「OnComponentBeginOverlap」ノードの末尾についていた「ShowInteractiveIcon」関数のノードを外しています。

![oncomponentbeginoverlap_interactive2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/7c37a134-f900-9349-5628-02ae00d91715.jpeg)<br><br>


最後に、[過去の記事](https://qiita.com/tuduru/items/5f7223f25b8e570751b1)で作成した、プレイヤーのBPのイベントグラフの「Enter」ノードを組み替え、下図のように組み替えます。インタラクト決定ボタンを押したときに、一番近くのインタラクト対象アクタの「Execute」関数を呼び出す処理を実装します。（今回の記事では、インタラクト決定ボタンを「Enter」キーとします。）

![interact_decidebutton.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/2f2930ff-48a9-2840-58db-2e10f35bada8.jpeg)<br><br>


これで、下の動画のように、インタラクト可能範囲内にいる、一番近くのインタラクト対象にのみインタラクトアイコンが表示され、インタラクトすることができます。


<iframe width="640" height="360" src="https://www.youtube.com/embed/vHYzkwhlYuM" title="interact 2 2" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br><br>

ただし、下の動画のような問題点があります。

<iframe width="640" height="360" src="https://www.youtube.com/embed/4-R8baIB15s" title="interact 2 3" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

上の動画のように、**プレイヤーの後ろにインタラクト対象アクタがあっても、一番近ければインタラクトできてしまいます**。

なので、プレイヤーの前側をインタラクト可能な向きとして考え、インタラクト可能な向きにいて、一番近くにあるインタラクト対象アクタにのみインタラクトできるようにしていきます。


# インタラクト可能な向きにいるインタラクト対象にのみインタラクトする

上で作成した「UpdateInteractableActor」関数のノードを、下図のように組み替えます。追加部分は、下図の水色枠の部分です。（ノードが長いので、2枚の図に分けております。）

![updateinteractableactor2_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/09f598e9-6cc2-0acd-02cf-52dbad69f091.jpeg)

![updateinteractableactor2_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/78fbd924-1cbc-5a61-df85-63fb38bf6633.jpeg)

上図における、赤線の「60.0」という値が、インタラクト対象可能となる、プレイヤーとインタラクト対象の角度差です。

「60.0」という値が入っているときは、下図の黄緑の角度の範囲にインタラクト対象アクタがいれば、インタラクト可能として判定されます。

![interactablerange.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/be42c972-db22-e424-8b45-c18a9b19a711.jpeg)<br><br>


これで、下の動画のように、インタラクト可能な向きにいて、一番近くにあるインタラクト対象アクタにのみインタラクトできるようになっています。

<iframe width="640" height="360" src="https://www.youtube.com/embed/JovqpQU8ufE" title="interact 2 1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br><br><br>



以上で今回の記事の内容は終了です。
最後まで読んでいただき、ありがとうございました。