UE4:HUDを用いたターゲットのマーキングについて
こんな感じのものを作りました。
HUDで行ったのはWidgetだとちょっとめんどくさいなぁと思いこっちで作ってみました。Widgetだとimageを動的に生成することが難しい(調べきれてないだけかも)のです。そうなると、一回はマーキングできますけど2個以降になると難しい。まあ、今回使うマーキングの画像を一つ置いてWidgetを何個も生成すれば出来るけども・・・
とりあえずHUDを用いた方法の一つということでまとめます。
Widgetの方法もあったら是非教えて下さい~!
仕様:
1.アクターに対し右クリックでマーキング
2.アクターに対して左クリックでアクターをマーキングごと消す。
3.一つのKey入力でLevel上にあるアクターすべてをマーキングする
使用するもの
FirstPersonテンプレート
1.アクターに対し右クリックでマーキング
FPSキャラクターのブループリント
まずFire以降のBPを全部消します。
右クリックのInputを設定します。
次にTraceLinebyObjectを用い以下のようにノードを組みます。
これでカメラから先のアクターを認識できます。
ObjectTypeには配列を作成し、ワールドダイナミックを設定します。これはアクター以外のオブジェクトに対し反応しないようにするためです。
次にActor型の配列を作成します。
カスタムイベントを作成しInputにアクターを設定します。
そして上のように配列にアクターを加えるようにノードを組みます。
次にもう一つカスタムイベントを作成します。
HUDにキャストしていますが、これは一人称のテンプレに入ってるHUDとなります。
HUD側のブループリント
DrawTextureをコピペしてテンプレのノード構成の後に繋げます。そしてまたActor型の配列を作成します。
FPSCharacter側のブループリント
一旦戻りまして、キャストから今作ったActor型の配列をセットで出し、FPSキャラクター側で作成したActor型の配列をセットします。
HUD側のブループリント
HUD側のブループリントに戻り配列からForEachLoopを出します。
これで配列にActorが入ってる分ループを回せるので複数のマーキングが出来るということです。
続きまして、GetからGetActorLocationを出しProjectを出します。これで2D情報に変換できます。これをBreakVectorで3つのFloat型の情報に分けます。
これでDrawTextureのScreenXYに入れるのもいいのですが、今回は動画のように常に画面上にマーキングを出しておきたいので以下のようにノードを組みます。
これはViewPortのサイズを出し、実行しながら数値を調節しClampのMaxに接続しました。これで動画のように常に画像に入ります。
FPSキャラクター側のブループリント
そして先ほど作成したカスタムイベントを画像の用に繋げます。
これでブループリントのアクターを作成します。
ただ球体を表示しただけのアクターです。
これで表示されるようになったと思います。
次にActorに一回だけ当たった時にのみマーキングをしたいと思います。
作成したカスタムイベントのActorからContainsを出します。これは配列に指定したActorが存在しているかどうかを判定しています。
これで配列にLineTraceで判定したActorが入っていなかった場合配列に入れ、入っていた場合はPrintStringでエラー文を出しました。
2,左クリックでActorをマーキングごと消す
次に左クリックをしたらマーキングごと消したいと思います。
以下のようにBoolean型の変数を作成しノードを組みます。
左クリックを押したらTrue、右クリックがfalseになるようにします。キャストは気にしないでください。ミスです。
次にブループリントインターフェースを作成します。
名前をDestroyerにしてインプットにアクター型の変数を入れました。
これを作成したActorに入れます。クラスの設定からインターフェースに追加で出来ます。
FPSキャラクター側のブループリント
次にActorをDestroyした後に配列からDestroyするアクターを取り出す作業をします。
Containsで配列にActorが存在しているかを確認した後入っていた場合Removeで取り除きます。
Actor側のブループリント
そしてDestroyerからFirstPersonCharacterをキャストして作成したカスタムイベントを入れます。そしてその後にDestoryActorでActorを消します。
FPSキャラクター側のブループリント
そしてActorからDestroyerを出し、ActorにSelfを入れれば完成です。
3.一つのKey入力でLevel上にあるアクターすべてをマーキングする
わざわざクリックするのめんどくさいよって人はGetAllActorOfClassでLevel上にある指定したActorを持ってきて配列化してTrackingに繋げれば一気にいけます。
ちなみにですが、
後ろを向くと画像のようになってしまうので以下のように微調節が必要です。
これ以外にもいろいろとあるはずなので是非作ったら情報共有お願いしますー!
以上
数カ月前に試しに作った奴が出てきました。
かなり適当ですね・・・