プレイヤー(自身)と最も近い敵にアイコン(UMG)を表示させる方法!

プレイヤー(自身)と最も近い敵に
アイコン(UMG)を表示させる方法!

 

を今回は紹介します。

 

↓最終的な出来としては以下のようになります。

youtu.be

 

※サードパーソンテンプレートを使用します

 

~敵の作成~

コンテンツフォルダ>ThirdPersonBP>Blueprintフォルダの中にある
「ThirdPersonCharacter」をコピーし、

コピーしたやつに「Enemy」という名前を付けます。

f:id:Free_Gamer:20190728014904p:plain

 

 

~BPインターフェースの作成~

「MyInterface」という名前のBPインターフェースを作成。

f:id:Free_Gamer:20190728015109p:plain

 

「MyInterface」開き

「SetUMGVisibilityBPI」という名のインターフェースを作成します。

f:id:Free_Gamer:20190728015354p:plain

インプット

f:id:Free_Gamer:20190728015547p:plain

 

~ThirdPersonCharacterにコンポーネントを追加~

「ThirdPersonCharacter」を開きます。

 

Sphereコンポーネントを追加します。

f:id:Free_Gamer:20190728015950p:plain

SphereRadiusを「225」にします。

f:id:Free_Gamer:20190728020124p:plain

 

~変数の作成~

f:id:Free_Gamer:20190728020743p:plain

デフォルト値の編集は特に無し。

 

~イベントグラフの作成~

オーバーラップイベントを使います。
f:id:Free_Gamer:20190728020302p:plain

 

Beginオーバーラップイベントです。

f:id:Free_Gamer:20190728021002p:plain

オーバーラップしたアクターがタグ持ちだった場合、配列に加える処理です。

配列に加えた後、タイマーイベントを開始しています。

このタイマーイベントは、自身に最も近い敵を算出する為のイベント「FindClosestEnemy」を、指定秒数間隔で呼び出しています。

 

「ActorIsValid」は自作マクロです。

f:id:Free_Gamer:20190728021151p:plain

中身はこうです。

f:id:Free_Gamer:20190728021205p:plain

 

Endオーバーラップイベントです。

f:id:Free_Gamer:20190728021649p:plain

 

f:id:Free_Gamer:20190728021759p:plain

f:id:Free_Gamer:20190728021821p:plain

f:id:Free_Gamer:20190728021833p:plain

f:id:Free_Gamer:20190728021847p:plain

f:id:Free_Gamer:20190728021910p:plain

f:id:Free_Gamer:20190728021931p:plain

 

タイマーで呼び出せれているイベント

「FindClosestEnemy」の処理を作成します。

f:id:Free_Gamer:20190728022235p:plain

 

カスタムイベント「FindClosestEnemy」が呼び出された時

オーバーラップしたアクターが格納されてる配列「OverlapEnemys」に

「1つ」以上アクターが格納されていればTrue。

f:id:Free_Gamer:20190728022249p:plain

 

自身の位置とSphereコンポーネントRadiusを変数に格納

f:id:Free_Gamer:20190728022524p:plain

 

ループ処理を行います。

f:id:Free_Gamer:20190728022626p:plain

 

↓LoopBodyに繋がる処理です。

トレース処理

f:id:Free_Gamer:20190728022652p:plain

 

自身と敵の距離を測定

f:id:Free_Gamer:20190728025657p:plain

 

トレースがヒットした時

自身と敵との距離を変数に格納します。

そして、ForEachLoopの「ArrayElement」を変数「TempFrontEnemy」に格納します。

f:id:Free_Gamer:20190728022808p:plain


↓Compleateに繋がる処理です。

ここはもうちょっと上手くコメントを書いて、説明したかったのですが

個人的にここの説明はなかなか難しかったので

単純に「AとBが不一致ならTrue」という雑な説明になってます。すいません・・・。

f:id:Free_Gamer:20190728022913p:plain

 

インプット値のVisibilityがFalseになってるインターフェースのターゲットを変数「Enemy」と繋げる。

Trueになってる方のターゲットは、変数「TempFrontEnemy」と繋げる。

f:id:Free_Gamer:20190728023050p:plain

変数「TempFrontEnemy」を変数「Enemy」にセット。

その後、変数「TempFrontEnemy」を空にする。

f:id:Free_Gamer:20190728023253p:plain

 

これでThirdPersonCharacterの編集は終わりです。

 

~アイコン(UMG)の作成~

「Takedown」という名のUMGを作成。

f:id:Free_Gamer:20190728023635p:plain

 

「Takedown」UMGの中身はこんな感じです。

f:id:Free_Gamer:20190728023710p:plain

f:id:Free_Gamer:20190728024020p:plain

正直各パネルの使い方がこれで正しいかどうかは分かりませんw

UMGは滅法詳しくないので。

Overlayの使い方もこれでいいのかさっぱりw

 

SizeBoxの詳細パネル

f:id:Free_Gamer:20190728024310p:plain

Textの詳細パネル

f:id:Free_Gamer:20190728024322p:plain

 

UMGはこれで終わりです。(適当)

 

 

~敵にコンポーネントを追加~
「Enemy」を開きます。

f:id:Free_Gamer:20190728024508p:plain

 

Widgetコンポーネントを追加

f:id:Free_Gamer:20190728024716p:plain

Widgetコンポーネントの詳細パネルで

「Space」を「Screen」にします。

「WidgetClass」を作成したUMG「Takedown」にします。

f:id:Free_Gamer:20190728024818p:plain

Widgetコンポーネントの位置は、「Z:90」で。

 

~イベントグラフ~

非常に単純です。

ゲーム開始時、Widgetコンポーネントを非表示

ThirdPersonCharacterから

「SetUMGVisibilityBPI」イベントが呼び出された時

Widgetコンポーネントの表示/非表示を行います。

f:id:Free_Gamer:20190728024558p:plain


これで完了です。

 

これで、一番最初にお見せした動画のようになるはずです。

 

それではまた!^^ノシ