前回の記事でポップアップする▼マーカーを作ってみたのですが、改造することにしました。
なぜかというと、このタイプのUI表示は同時に複数出ることがなく、常に一つだけが表示されます。前回の作り方では呼び出し元であるActorの配置とタイミング次第では、いくつもスポーンしてしまう可能性があったからです。複数個現れないようにきっちリと管理すればいいのですが、ちょっとフローが複雑になりそうなので思い切って作り変えることにしました。
どうやらプログラム界隈では「シングルトン パターン」なるものがあるようで、同じような感じの扱いができないかな? ということで試してみたのが今回の内容でもあります。
UE4にその仕組みが実装できるのかどうか、自分の頭では見つけられなかったので、完全に我流になります。
前回作った、BP_PopMarker をあらかじめワールドに置いておきます。座標は適宜書き換えることになるので、適当な位置でも大丈夫。
このブループリントをさっそく改造します。
最初から表示されていない方がいいので Construction Script 内で非表示にします。
Set Visibilityノードにある2つのチェックボックスのうち、
Propagate to Children にチェックを付けると、Targetの子階層もまとめて扱うことができます。この場合 Default Scene Root に対して設定しているので、このBlueprintに含まれる全てが対象になります。
次に、変数の設定を変えます。
前回このName型の変数は、 Expose on Spawn にチェックを入れていました。
これを戻します。
この変数は、値を受け取るという役割のはそのままです。
次に
Event Graph の Event BeginPlay につないだノードを編集します。
キャストノードの後ろの部分を消します。
そしてキャスト結果にピンから変数を昇格させて作ります。
続けて、できたばかりのオリジナルWidget型の変数を利用するために、
新しくカスタムイベントを2つ追加します。
まずは表示開始のイベント。
表示終了のイベント。
用が済んだので変数の中身を空にしています。
これでポップするブループリントは完成です。
このポップアップマーカー▼の呼び出し元を変えます。
このブループリント内で、コリジョンの判定をしていましたが、バッサリ止めます。
あとは、変数化していたWidget型の変数を削除してお片付け完了です。
スッキリしたところで保存します。
これで前回分の改造は終了です。ここからは、新しく追加する作業です。
レベルブループリントで
ワールドに置いた BP_PopMarker をレベルブループリントから扱います。
レベルブループリントを開くには、Blueprintsアイコンの横の▼メニューから。
開いたら、ワールドアウトライナから、配置した BP_Chair をドラッグ&ドロップします。
このノードからコリジョン判定のBindイベントノードを取り出します。
Assign On Actor Begin Overlap を選択するとノードが2つ出てきます。
このBind~ ノードに、Event BeginPlayノードと、他の BP_Chair をつなぎます。
カスタムイベントに下図のようにつないでいきます。
タグの有無を判定して存在していれば、ワールドに置いている BP_PopMarkerのポジションを変更して、中のカスタムイベントにタグを渡しています。
カスタムイベントからは、値を2つ受け取ることができます。気になる場合は、Print StringノードにつなぐとActor名が確認できます。Overlaped Actor はこの場合 BP_Chair になります。
同様に、コリジョンから出た時のイベントもつなぎます。今度は、
Assign On Actor End Overlap です。
Begin Overlap と同じように他の BP_Chair もつなぎます。
カスタムイベントには、BP_PopMarker の中のイベント(消去用)を呼び出しています。
これで完了です。
コンパイルして確認してみましょう。
前回と比べて変わることは無いのですが・・・
BP_Chair に 追加していた判定のイベントがごっそり無くなったことで、複数を配置したときの容量が節約できています。
シングルトンパターンなんていう身に持て余した言葉を冒頭に掲げたものの、結局は大したことしてなくて、ワールドに直置きしてそれを利用しているだけという・・・
ブループリントインターフェイスも試してみたのですが、インスタンスをうまく経由させることができませんでした。むむむ。力不足。
ひとまずこの方法で、もう少し進めてみようと思います。
ツッコミ等あればコメントください。
ではでは
ステキにポップする▼ライフを!
補足
前回の記事を実践している前提で書いたので、端折っているところが かなりあります。
もし今回の記事から読んで、やってみようと思われる方は、
前回の記事を進めていく中で、BP_Chair を作る際に Boxコリジョンを置くだけOKです。