PR

【UE5】「画面範囲ロックオン」を作ってみようその2:画面上の敵にマーカーをつける!【TPSシューター】

UnrealEngine5

本記事は「UE5_Ver5.3.2」で制作しているよ

また【画面範囲ロックオン」を作ってみよう】シリーズは、一部記事が「有料」だよ
ご理解のもと閲覧していってね

また、前提条件として「射撃システム」を実装する必要があるよ
まだしてないのなら下記のURLから飛んで見てみてね

こんにちは!ウンパッパです!

今回は「画面範囲ロックオン」を作ってみよう第2弾!

画面上の敵に「マーカー」を表示させたいと思うよ

この記事は「レーダーを作って敵を探知する!」の続きだから
もし見てなかったら下のボタンから飛んでみてね

まずこの記事で何が実装されるのか、「完成した姿」を見てみよう

敵にずっと「マーカー(四角いUI)」が表示されているね

距離を離れても画面と比べて常に一定のサイズを保っていて
敵を撃破したときはしっかりと「マーカー」が消えてるよ

最終的には
このマーカーの表示が切り替わることによって
どの敵が「ロックオン」されているのかを分かるようにするのが目的だよ

そのための土台として「すべての見えている敵にマーカーを表示」されるようにするよ

それでは早速作ってみよう!

「BP_HUD」を作ろう!

まずは「マーカー」を画面上に表示させるための「UI表示設定」を作りに行こう

そのために「HUD」という「ブループリント」を作りに行くよ

「レベルエディタ」にて
「コンテンツブラウザ」から「Blueprint」を開いて

「右クリック」⇒「blueprint」⇒「検索」で「HUD」 と入力し
「HUD」を「選択」

「HUD」を生成できたら名前を「SRLO_HUD」と命名しよう

その後、「レベルエディター」の画面右下にある「ワールドセッティング」にて

「Game Mode」内にある「HUD Class」に さっき作った「SRLO_HUD」を設定しよう

これで「UI表示設定」の作成と割り当てはOKだ

画面上の敵に「マーカー」を表示しよう

画面上の敵にマーカーを表示させるようにするよ

やり方としては
「SRLO_System」の「SearchRadar関数」で取得できる「Enemy配列」

この「Enemy配列」を「SRLO_HUD」にも受け取れるようにするんだ

そして受け取った「Enemy配列」のデータを使って
「アクターの中心にマーカーが表示される」ようにブループリントを組んでいくよ

「HUD」に「マーカー」を表示させる設定をする

まずは「画面のサイズ」を取得しに行くよ

「SRLO_HUD」を開いて

こんな感じに変数を作りつつノードを組んでね

作った変数名内容
Screen Siza XFloat0「プロジェクト設定」で設定した画面サイズの「中央の位置」を取得するよ
「横軸の半分の値」=「横軸の中央の値」だ
Screen Siza YFloat0「プロジェクト設定」で設定した画面サイズの「中央の位置」を取得するよ
「縦軸の半分の値」=「縦軸の中央の値」だ

次に、「Track Enemies」という「関数」を作ってつなげてね

できたら「Track Enemies」を開いて

「SRLO_System」と同じように「Enemy」という「アクター変数」を作ってね

作った変数名変数のタイプ内容
EnemyActor0配列「SRLO_System」から入手した「Enemy変数」を入れるための「配列」
ここから「敵の(位置)情報」を取得し「マーカー」を貼るよう組み込む

作ったらこんな感じに、変数を作りながらノードを組んでみよう

作った変数名内容
Marker SizeFloat32画面上に映るマーカーの大きさ
Target MarkerTextureT_TrackingMarker表示させるテクスチャ
「□」を表示させるよ

組んだら「Draw Textureノード」の「texture U Width」と「texture V Width」を「1.0」にする

出来たら「SRLO_HUD」側はOK

次に「SRLO_System」の方を組み立てに行くよ

「System」から「HUD」にデータを送れるようにする

まずは「System」から「HUD」にデータが送れるよう紐づけするよ

「SRLO_System」を開たら「イベントグラフ」にて
「Sequenceノード」を作ってこんな感じにノードを組んでね

組み立てたら

「Search Radar関数」にある「Prayer Pawn」ノードを「Sequenceノード」の「Then0」に移動
「Search Radar関数」側の「Prayer Pawn」は削除してね

出来たら、こんな感じに変数を作りながらノードを組んでね

作った変数名内容
SRLO HUDSRLO HUD「HUD」から「変数」やその他データを取得したり送ることが出来るようになる

組み立て終わったら情報の取得はOKだ

「Enemyのデータ」を「HUD」に送る

「Search Radar」で探知した「Enemy」のデータを「HUD」側の「Enemy配列」にも送るようにするよ

「Search Radar」を開いてこんな感じに組んでね

これで「データの送信」はOKだ

組み終わったら「プレイ」してみよう

「敵」に近寄ると画面中央に「マーカー」が表示されたね

しかも「敵」を取得した数が多いほど「マーカー」が濃くなる

これは「敵」の数だけ「マーカー」が生成されてるから、重なって濃くなってるんだ

つまり、「マーカー」の数は足りている
後はこの「マーカー」を「敵」の中心に表示させれば目標達成だ!

「マーカー」を敵に追尾させよう

「SRLO_HUD」の「Track Enemies関数」を開いて

こんな感じにノードを組んでね

組み終わったら「プレイ」してみよう

近寄ったら「マーカー」が「敵の中心」に表示された!

やったね!

ただ、一つ確かめなきゃいけないことがあるんだ

「フィールド上にいる敵が消滅」した場合何が起こるのか

これを検証していこう

「敵を消滅」させてみる

やり方としては

「SRLO_HUD」にて望まない挙動が起きたらログが表示されるようにして

別記事で解説した「射撃システムを作ろう!」で作った「Projectile(弾丸)」に
当たったアクターが消滅する「消滅属性」を付ける

そして実際にその弾丸を当てて敵を消滅させ、どうなるかを確かめるんだ

弾丸を「消滅属性」にする

別記事で解説した「射撃システムを作ろう!」で作った「Projectile(弾丸)」に

当たったアクターが消滅する「消滅属性」を付けていくよ

まずは「Projectile」のブループリントを開いて

ダメージ関連のノードを削除してこんな感じにノードを組んでね

これで弾丸が「アクター」に当たったらその「アクター」は消滅するよ

逆に「アクターではない背景」は消滅しないから背景周りに特別な操作をしなくてもOKだ

望まない挙動が起きたらログを表示させる

「SRLO_HUD」の「Track Enemies関数」を開いて

「Is Validノード」の「Is Not Validピン」に「Print Stringノード」を付けて
有効ではないデータが生まれてしまった場合にログが表示されるようにしよう

うん、「有効なデータではない」というログがたくさん表示されたね

これは、「敵を消滅」させてしまったせいで
「Enemy配列」には「敵の情報」があるのに「ゲーム内」には同じ「敵の情報」が無い
という状態を作ってしまったのが理由なんだ

その結果「存在しないのに探している」という余計な動作が生まれて
それが「有効なデータではない」と表示させているんだ

なので、敵が消滅した際は「Enemy配列」から「排除」して
「配列」と「ゲーム内」を「同じ状態」にする必要があるんだ

というわけで、「配列の排除」を作っていこう!

消滅した敵を「配列から排除」する

「Search Radar」の探知範囲外になった「アクター」を「Enemy配列」から「排除」する
という形で作っていくよ

「アクターが消滅」した場合でも「探知範囲外」扱いになるので問題なく「配列から排除」できるんだ

そのためにはまず「配列の排除」を作っていくよ

ただ、
「SystemのEnemy配列」だけでなく「HUDのEnemy配列」も同時に排除する必要があるから

「HUDのEnemy配列」を排除させるために
「HUDもSystemにアクセスできる」用にしよう

「HUD」も「System」にアクセスできるようにする

「同時排除」を目指して「HUD」と「System」を相互フォローさせていこう!

まずは「SRLO_HUD」の「カスタムイベント」にて
こんな感じに変数を作りつつノードを組んでね

作った変数名内容
SRLO SystemSRLO System「System」から「変数」やそのほかデータを取得したり送ることが出来るようになる

ノードを組めたらOKだ

次に行こう

「Search Radar」の範囲外なら「排除」する

配列を排除する「Track End関数」を作っていくよ

この関数を作らずに直接「Removeノード」をつなげるとうまく排除できないから
確実な動作のためにも作ってね

「SRLO_System」にて

まずは「Track End関数」を作ってこんな感じに組んでね

関数の「入力ノード」から「Actor」が入力できるようになってるよ

「Track End関数」が出来たら次は

「Search Radar関数」を開いてこんな感じにノードを組んでね

組み終わったら早速「プレイ」してみよう

「敵」が探知範囲外になったら「マーカー」から外れているし

「探知範囲内で敵を排除」しても「エラーログ」は表示されるけど「止まる」

余計な処理が永遠と続かない、正常な状態で「敵にマーカーを表示させる」が実装できたよ

やったね!


ただ、ここで終わらせてはいけないんだ

当たり判定の境界に「敵」がいる際に連続取得をやめさせる

この画像を見て
「Search Radar」の当たり判定を「敵」にぎりぎり当たるようにしてみたよ

連続取得…しちゃってるね

これの原因は「追加」と「排除」の基準がそろってんないからなんだ

「配列排除」するときに「距離」を指定してるのに
「配列追加」する際は距離を決めてない

そして「Multi Sphere Trace By Channelノード」は「コリジョン同士の接触」でアクターを取得して「追加」してるのに

配列排除で比べてる「距離」が
「アクターの中心から」であって
「アクターのコリジョンから」ではない

なので
何度も「コリジョンに当たって」取得して、
何度も「アクターの中心じゃない」から排除してるんだね

というわけで「配列追加」側にも「距離の指定」を行おう!

できたら「プレイ」してみよう

連続取得が起きない!

ちゃんと「アクターの中心」で「追加」と「排除」が行えてるね

これにてパーペキに「敵にマーカーを表示させる」の実装が完了だ!

やったね!!!

おわりに

以上、
「画面範囲ロックオン」を作ってみようその2:画面上の敵にマーカーをつける!
でした!

ここまで読んでくれてありがとね!
次回は「Tag=Enemy なら弾がホーミングする」
を作っていきたいと思うよ!

下のボタンから次のページに進めるよから

よかったら見ていってね!

一覧に戻る

コメント

unpappa

3Dとゲーム制作を趣味でたしなむ遊び人
ロボットアニメとアニメ調のキャラが好きで趣味でちょこちょこ作ります
人生の目標は「オリジナルのロボゲー」を1本作る事!
初心者だからこそ、いろいろな荒波がやってくるけど、それらを学びに変えて
「最もわかりやすいクリエイティブブログ」を目指してます!どうぞ良しなに!

unpappaをフォローする
Ci-enを始めました!あなたの応援で本サイトの記事の投稿頻度と質を向上させることができます!
詳しく見る!
Ci-enを始めました!あなたの応援で本サイトの記事の投稿頻度と質を向上させることができます!
詳しく見る!
タイトルとURLをコピーしました