バイオハザード7 または Village(8)のようなインタラクトアイコンを表示したい

お世話になってます。
表題の件で、負荷や拡張性を見据えてこのまま実装を進めて良いのかかなり悩んでおり、Forumに投稿しました。
以下、具体的な内容になります。

概要

バイオハザード7や8では、インタラクト可能なアイテムに近づくと以下のようなアイコンが表示されます。(以降このアイコンのことを強調表示といいます)

これを自分のゲームに実装したくて、現在奮闘中です。

試した事

①アイテムのBPにCollisionを用意してうまい事やる

ゲーム内で色々試してみて、まずは以下のような仕様だと仮定しました。

プレイヤーが強調表示可能な範囲にOverlapし、強調表示可能なView/angleの場合、強調表示する

この機能を実装するためにSphereCollisionComponentをもったBP(以降、ItemBP)を作成し、以下のような内容で実装しました。

  1. ItemBPのSphereCollisionにPlayerがOverlapしたら、インタフェースで自身の参照をPlayerControllerに渡す
  2. PlayerControllerは受け取った参照を強調表示可能アイテム配列に格納する
  3. PlayerControllerで視界を取得し、強調表示可能アイテムが視界の特定の範囲内に入ったら、そのItemBPに対してインターフェースで通知を行う
  4. 通知を受け取ったItemBPは設定されている強調表示用Widgetに対してインターフェースでアニメーション開始通知を送り、setVisibilityでtrueを設定する

この内容でも強調表示自体はできるのですが、アイテムとプレイヤーの間に壁がある場合でもアイコンが表示されてします。
そのため、それを防ぐためには強調表示可能アイテム配列に入ってるActorとLineTraceで結び、間に壁などがある場合は強調表示しないなどの仕様を追加で実装する必要がありました。

②MultiTraceを利用する

①のような経緯があり、他の人はどのように実装しているのか気になり始め、色々しらべてみたのですが全く同じ要件を実装している人は多くありませんでした。
ですが、このような動画を見つけ、初めてMultiTraceの存在を知りました。
一見、楽に実装できそうだったのですが、アイテムごとに範囲を変えたい場合などに色々と面倒そうだと感じています。

質問

上記のような状況で、①でも②でもごにょごにょ付け足してやれば要件を満たせるような実装ができると思うのですが、MultiTraceという初めて知る機能も出てきたので、「もっとスマートな方法があるのでは?」という疑問が常につきまとっています。「動いていればそれが正解」という名言もありますが、一種の正解のようなものを知りたく、アドバイスいただけると非常に助かります。

作業環境

  • Unreal Engine 5.2.1
  • Windows

@0u0high

こんにちは

  • 距離+遮蔽物判定の実装ならLineTraceを使う方法、つまり1の方法が正解だと思います
    エンジンの機能を何かしら使うとしても、自分でごにょごにょするのは変わりません
    実装済みのItemBPの内容は不可も不利もないと思います

  • ただ、拡張性に関しては、オーバーラップ判定+ライントレース+PlayerControllerとの連絡をするコンポーネントを自分で作って、任意のアイテムにそれを持たせるだけにした方が後々楽ができるかもしれませんね


  • また、標準で用意されているSpringArmComponentは、内部でLineTraceを使用していて、コリジョンとその長さを設定するパラメーターが用意されています
    IsCollisionFixApplied ノードにより最終Tickのトレース結果をチェックできます
    (自分でごにょごにょするのは変わらないので、何かが楽になるとは思いませんが)

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.