オブジェクトを両手で持った際に発生する、ウィジェットの不具合について

いつもお世話になっております。
UE4.27のVR templateにて、以下のような機能を実装しました。

オブジェクトを持った際、ウィジェットをスポーンさせる内容です。
手を離すと、ウィジェットは破壊されて消失します。
これはテンプレートのGrabCompornetに備わっていた、On Grabbed On Droppedを利用したものになります。

Grab

ここからが表題の件です。
以下のように両手で持つと、ずっとスポーンしたままになってしまいます。

Grab bug

この両手で握るとスポーンされたままになる不具合をなくしたいです。
ぜひご教授のほど、よろしくお願いいたします。

この機能は以下の通りに作成しました。

①新規にウィジェットブループリントを作成。「Cube Guide」と名付け、適当にレイアウトする。

②また新規にBPを作成する。キューブに関わるので「widget Cube」と名付ける。
コンポーネント(Widget)を追加しておき、右サイド詳細のWidget Classが、①で作成した「Cube Guide」に設定。

③ここからオブジェクト(上記のGifにて掴んだ黒と黄色のキューブ)自体のBPをいじる。
テンプレートに備わっていたGrab Compornetから、物をつかんだ時のイベント(On Grabbed)と離した時のイベント(On Dropped)を追加し、それぞれSpawn ActorとDestroy Actorにつなげる。
変数も新しく追加して、型を②のBP「widget Cube」を選択し、ターゲットにつなげる。

このようにして、物をつかんだ時と離した時にウィジェットを出現させたり、消したりできるようにしました。ご助力いただけるのであれば幸いです。何卒よろしくお願いいたします。

きちんとコントロールしたければ、生成したActorやComponentは全て変数として確保しておく必要があります

今回の場合、片手で掴んだ時点でまずWidgetActorがSpawnされ、変数に格納されます(これを仮にWidgetAと呼びます)
その後片手で掴んだままもう片方の手で掴むと、更にWidgetActorがSpawnされ、変数に格納されます(これを仮にWidgetBと呼びます)
その際、もとから変数に入っていたWidgetAへの参照は上書きされ、変数にはWidgetBへの参照のみが残ります
こうしてWidgetAは完全にフリーになります

その後、手を放したときに変数に格納されているWidgetをDestroyしますが、変数に格納されているWidgetはWidgetBのみ、WidgetAは誰も参照を持っていないため消すことができなくなります

これが起きていることの全てです

ここで取るべきは以下のいずれかになります

  • IsValid等を用いて、Widgetが1つしか生成されないようにする
  • 配列等を用いて、生成したWidgetの参照を全て掴んでおく

提示されている仕様であれば、IsValidを用いて1つのみに限定する方が良いかと思います

2 Likes

こちらで解決しました!ありがとうございました。