4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Unreal Engine (UE)Advent Calendar 2023

Day 18

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

Posted at

概要

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

この記事の主な対象者

  • Blueprint(BP)の作り方の基礎を習得されている、初心者の方

事前準備

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

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

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

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

まずは、一番近くのインタラクト対象を格納する用の変数を作成します。変数の型は、過去の記事で作成した、インタラクト対象のアクタのベースとするアクタのBP「BP_InteractiveActor」にします。(今回の記事では、変数名を「InteractableActor」にします。)

interactableactor2.jpg

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

distancesquredmin.jpg

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

floatmax.jpg

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

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

only_distance_graph.jpg

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

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

tick_interactive2.jpg

次に、過去の記事で作成した、プレイヤーのBPのイベントグラフの「OnComponentBeginOverlap」ノードを下図のように組み替えます。過去の記事の「OnComponentBeginOverlap」ノードの末尾についていた「ShowInteractiveIcon」関数のノードを外しています。

oncomponentbeginoverlap_interactive2.jpg

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

interact_decidebutton.jpg

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



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

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

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

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

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

updateinteractableactor2_1.jpg

updateinteractableactor2_2.jpg

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

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

interactablerange.jpg

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




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

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?