みつまめ杏仁

アンリアルエンジン(UE4)でGUIを作るためにゴニョゴニョしてます。UIデザイナーの皆様の助けになれば幸いです。

話しかけるときなんかのマーカーみたいなやつを作ってみる【改】

前回の記事でポップアップする▼マーカーを作ってみたのですが、改造することにしました。

limesode.hatenablog.com

なぜかというと、このタイプのUI表示は同時に複数出ることがなく、常に一つだけが表示されます。前回の作り方では呼び出し元であるActorの配置とタイミング次第では、いくつもスポーンしてしまう可能性があったからです。複数個現れないようにきっちリと管理すればいいのですが、ちょっとフローが複雑になりそうなので思い切って作り変えることにしました。

どうやらプログラム界隈では「シングルトン パターン」なるものがあるようで、同じような感じの扱いができないかな? ということで試してみたのが今回の内容でもあります。

UE4にその仕組みが実装できるのかどうか、自分の頭では見つけられなかったので、完全に我流になります。

 

前回作った、BP_PopMarker をあらかじめワールドに置いておきます。座標は適宜書き換えることになるので、適当な位置でも大丈夫。

f:id:hiyokosabrey:20171017225130p:plain

このブループリントをさっそく改造します。

最初から表示されていない方がいいので Construction Script 内で非表示にします。

f:id:hiyokosabrey:20171017225748p:plain

Set Visibilityノードにある2つのチェックボックスのうち、

Propagate to Children にチェックを付けると、Targetの子階層もまとめて扱うことができます。この場合 Default Scene Root に対して設定しているので、このBlueprintに含まれる全てが対象になります。

 

次に、変数の設定を変えます。

f:id:hiyokosabrey:20171017230356p:plain

前回このName型の変数は、 Expose on Spawn にチェックを入れていました。

これを戻します。

f:id:hiyokosabrey:20171017230648p:plain

この変数は、値を受け取るという役割のはそのままです。

 

次に

Event Graph の Event BeginPlay につないだノードを編集します。

f:id:hiyokosabrey:20171017232016p:plain

 キャストノードの後ろの部分を消します。

そしてキャスト結果にピンから変数を昇格させて作ります。

f:id:hiyokosabrey:20171017232048p:plain

 

続けて、できたばかりのオリジナルWidget型の変数を利用するために、

新しくカスタムイベントを2つ追加します。

まずは表示開始のイベント。

f:id:hiyokosabrey:20171017230845p:plain

表示終了のイベント。

f:id:hiyokosabrey:20171017230854p:plain

用が済んだので変数の中身を空にしています。

 

これでポップするブループリントは完成です。

 

このポップアップマーカー▼の呼び出し元を変えます。

f:id:hiyokosabrey:20171017232910p:plain

このブループリント内で、コリジョンの判定をしていましたが、バッサリ止めます。

f:id:hiyokosabrey:20171017233341p:plain

あとは、変数化していたWidget型の変数を削除してお片付け完了です。

f:id:hiyokosabrey:20171017233627p:plain

スッキリしたところで保存します。

 

これで前回分の改造は終了です。ここからは、新しく追加する作業です。

 

レベルブループリントで

ワールドに置いた BP_PopMarker をレベルブループリントから扱います。

レベルブループリントを開くには、Blueprintsアイコンの横の▼メニューから。

f:id:hiyokosabrey:20171017234332p:plain

開いたら、ワールドアウトライナから、配置した BP_Chair をドラッグ&ドロップします。

f:id:hiyokosabrey:20171017235213p:plain

このノードからコリジョン判定のBindイベントノードを取り出します。

f:id:hiyokosabrey:20171017235915p:plain

Assign On Actor Begin Overlap を選択するとノードが2つ出てきます。

f:id:hiyokosabrey:20171018000239p:plain

このBind~ ノードに、Event BeginPlayノードと、他の BP_Chair をつなぎます。

f:id:hiyokosabrey:20171018000618p:plain

カスタムイベントに下図のようにつないでいきます。

f:id:hiyokosabrey:20171018001436p:plain

タグの有無を判定して存在していれば、ワールドに置いている BP_PopMarkerのポジションを変更して、中のカスタムイベントにタグを渡しています。

カスタムイベントからは、値を2つ受け取ることができます。気になる場合は、Print StringノードにつなぐとActor名が確認できます。Overlaped Actor はこの場合 BP_Chair になります。

 

同様に、コリジョンから出た時のイベントもつなぎます。今度は、

Assign On Actor End Overlap です。

f:id:hiyokosabrey:20171018002618p:plain

Begin Overlap と同じように他の BP_Chair もつなぎます。

f:id:hiyokosabrey:20171018002949p:plain

カスタムイベントには、BP_PopMarker の中のイベント(消去用)を呼び出しています。

これで完了です。

 

 

コンパイルして確認してみましょう。

f:id:hiyokosabrey:20171018004138j:plain

前回と比べて変わることは無いのですが・・・

 

BP_Chair に 追加していた判定のイベントがごっそり無くなったことで、複数を配置したときの容量が節約できています。

シングルトンパターンなんていう身に持て余した言葉を冒頭に掲げたものの、結局は大したことしてなくて、ワールドに直置きしてそれを利用しているだけという・・・

ブループリントインターフェイスも試してみたのですが、インスタンスをうまく経由させることができませんでした。むむむ。力不足。

 

ひとまずこの方法で、もう少し進めてみようと思います。

ツッコミ等あればコメントください。

 

ではでは

ステキにポップする▼ライフを!

 

 

補足

前回の記事を実践している前提で書いたので、端折っているところが かなりあります。

 もし今回の記事から読んで、やってみようと思われる方は、

前回の記事を進めていく中で、BP_Chair を作る際に Boxコリジョンを置くだけOKです。