僕の私のUnrealな日々

UE4のBluePrintを使って小さなギミックを作ったりしてます。ブログを通じて情報共有ができたらなと思います。

UE4:HUDを用いたターゲットのマーキングについて

f:id:Bussan_dayo:20160411223921p:plain

 

 

 

 

 

 

 

こんな感じのものを作りました。

HUDで行ったのはWidgetだとちょっとめんどくさいなぁと思いこっちで作ってみました。Widgetだとimageを動的に生成することが難しい(調べきれてないだけかも)のです。そうなると、一回はマーキングできますけど2個以降になると難しい。まあ、今回使うマーキングの画像を一つ置いてWidgetを何個も生成すれば出来るけども・・・

 

とりあえずHUDを用いた方法の一つということでまとめます。

Widgetの方法もあったら是非教えて下さい~!

 

仕様:

1.アクターに対し右クリックでマーキング

2.アクターに対して左クリックでアクターをマーキングごと消す。

3.一つのKey入力でLevel上にあるアクターすべてをマーキングする

 

使用するもの

FirstPersonテンプレート

 

 1.アクターに対し右クリックでマーキング

FPSキャラクターのブループリント

まずFire以降のBPを全部消します。

f:id:Bussan_dayo:20160411215928p:plain

 

右クリックのInputを設定します。

 

f:id:Bussan_dayo:20160411223331p:plain

 

次にTraceLinebyObjectを用い以下のようにノードを組みます。

f:id:Bussan_dayo:20160411220150p:plain

これでカメラから先のアクターを認識できます。

 

 

ObjectTypeには配列を作成し、ワールドダイナミックを設定します。これはアクター以外のオブジェクトに対し反応しないようにするためです。

 

次にActor型の配列を作成します。

f:id:Bussan_dayo:20160411220347p:plain

 

 

カスタムイベントを作成しInputにアクターを設定します。

f:id:Bussan_dayo:20160411220428p:plain

そして上のように配列にアクターを加えるようにノードを組みます。

 

 

次にもう一つカスタムイベントを作成します。

f:id:Bussan_dayo:20160411220522p:plain

 

HUDにキャストしていますが、これは一人称のテンプレに入ってるHUDとなります。

 

HUD側のブループリント

 

DrawTextureをコピペしてテンプレのノード構成の後に繋げます。そしてまたActor型の配列を作成します。

f:id:Bussan_dayo:20160411220558p:plain

 

 

FPSCharacter側のブループリント

一旦戻りまして、キャストから今作ったActor型の配列をセットで出し、FPSキャラクター側で作成したActor型の配列をセットします。

f:id:Bussan_dayo:20160411220729p:plain

 

HUD側のブループリント

HUD側のブループリントに戻り配列からForEachLoopを出します。

f:id:Bussan_dayo:20160411220941p:plain

 

これで配列にActorが入ってる分ループを回せるので複数のマーキングが出来るということです。

 

続きまして、GetからGetActorLocationを出しProjectを出します。これで2D情報に変換できます。これをBreakVectorで3つのFloat型の情報に分けます。

f:id:Bussan_dayo:20160411221108p:plain

 

これでDrawTextureのScreenXYに入れるのもいいのですが、今回は動画のように常に画面上にマーキングを出しておきたいので以下のようにノードを組みます。

 

f:id:Bussan_dayo:20160411221307p:plain

これはViewPortのサイズを出し、実行しながら数値を調節しClampのMaxに接続しました。これで動画のように常に画像に入ります。

 

FPSキャラクター側のブループリント

そして先ほど作成したカスタムイベントを画像の用に繋げます。

f:id:Bussan_dayo:20160411221540p:plain

 

これでブループリントのアクターを作成します。

f:id:Bussan_dayo:20160411222423p:plain

ただ球体を表示しただけのアクターです。

 

これで表示されるようになったと思います。

 

次にActorに一回だけ当たった時にのみマーキングをしたいと思います。

作成したカスタムイベントのActorからContainsを出します。これは配列に指定したActorが存在しているかどうかを判定しています。

f:id:Bussan_dayo:20160411221641p:plain

 

これで配列にLineTraceで判定したActorが入っていなかった場合配列に入れ、入っていた場合はPrintStringでエラー文を出しました。

f:id:Bussan_dayo:20160411223706p:plain

 

 

 

2,左クリックでActorをマーキングごと消す

次に左クリックをしたらマーキングごと消したいと思います。

以下のようにBoolean型の変数を作成しノードを組みます。

f:id:Bussan_dayo:20160411222105p:plain

 

左クリックを押したらTrue、右クリックがfalseになるようにします。キャストは気にしないでください。ミスです。

 

次にブループリントインターフェースを作成します。

名前をDestroyerにしてインプットにアクター型の変数を入れました。

f:id:Bussan_dayo:20160411222230p:plain

 

これを作成したActorに入れます。クラスの設定からインターフェースに追加で出来ます。

f:id:Bussan_dayo:20160411222501p:plain

 

 

FPSキャラクター側のブループリント

次にActorをDestroyした後に配列からDestroyするアクターを取り出す作業をします。

 

Containsで配列にActorが存在しているかを確認した後入っていた場合Removeで取り除きます。

f:id:Bussan_dayo:20160411222617p:plain

 

 

Actor側のブループリント

そしてDestroyerからFirstPersonCharacterをキャストして作成したカスタムイベントを入れます。そしてその後にDestoryActorでActorを消します。

f:id:Bussan_dayo:20160411222800p:plain

 

FPSキャラクター側のブループリント

そしてActorからDestroyerを出し、ActorにSelfを入れれば完成です。

f:id:Bussan_dayo:20160411222926p:plain

 

 3.一つのKey入力でLevel上にあるアクターすべてをマーキングする

わざわざクリックするのめんどくさいよって人はGetAllActorOfClassでLevel上にある指定したActorを持ってきて配列化してTrackingに繋げれば一気にいけます。

f:id:Bussan_dayo:20160411225733p:plain

f:id:Bussan_dayo:20160411225929p:plain

 

 

 

 

 

 

ちなみにですが、

f:id:Bussan_dayo:20160411223009p:plain

 

後ろを向くと画像のようになってしまうので以下のように微調節が必要です。

 

f:id:Bussan_dayo:20160411223008p:plain

 

 

これ以外にもいろいろとあるはずなので是非作ったら情報共有お願いしますー!

 

以上

 

 

数カ月前に試しに作った奴が出てきました。

かなり適当ですね・・・

www.youtube.com