本記事は「UE5_Ver5.3.2」で制作しているよ
また【画面範囲ロックオン」を作ってみよう】シリーズは、一部記事が「有料」だよ
ご理解のもと閲覧していってねまた、前提条件として「射撃システム」を実装する必要があるよ
まだしてないのなら下記のURLから飛んで見てみてね
こんにちは!ウンパッパです!
今回は立体的に動いて戦う
「ハイスピードロボットアクションゲーム」なら定番!
アーマードコアのような
「画面に範囲を表示して、範囲内に敵が入ってきた際にロックオンするシステム」
略して「画面範囲ロックオン」を作っていくよ!
まずは「画面範囲ロックオン」が完成した際の動画を見てみよう!
「外側」と「内側」の「2つの画面範囲」があって
敵が「外側の範囲」に入ったら「敵がロックオン」されて
敵が「内側の範囲」に入ったら「その敵を優先的にロックオン」する
ロックオン中に射撃すると「ホーミング弾が敵に誘導される」
そして「ロックオン範囲」から外れると「ロックオンを解除」する
というシステムだね!
そして今回作るのはこれ
「球状の範囲を探知して敵を取得する」システムだよ
これを実装することで、
ロックオンを指定するための「すべての敵の情報」を取得できるようになるんだ
取得した情報の中で「条件に合ったものだけをに割り振る」ことでロックオンを実現しているんだね
それでは早速作ってみよう!
素材をProjectに追加する
まずは「素材」をプロジェクトに追加するよ
まずはこの素材をダウンロードしてね
ファイルの内容物は以下の通り
「ロックオン時のSE」
「ロックオンしたときに敵に表示するマーカー」
「敵に常に追尾するマーカー」
だよ
既に作ってもらってるであろう「TPS_Project」の「アセットブラウザ」にて
「コンテンツ」内にさっきダウンロードして解凍した
「SR_LockOn_Asset」を「ドラッグ&ドロップ」で追加
「SR_LockOn_Asset」フォルダ内に
「1つのSE音源」と「2つのテクスチャ素材」があればOKだ
ただ「コンテンツブラウザ」上での表示が真っ白になっているね
これを素材がわかるように表示させていこう
まずは「テクスチャ」を「ダブルクリック」で開いてね
そしたら
テクスチャの設定画面に飛ぶから
画面右側の「詳細」⇒「レベルオブティテール」⇒「Texture Group」
を、用途に合わせた設定に変えてね
今回は「UI」に設定するよ
設定できたら「保存」をしてね
これで「コンテンツブラウザ」に戻ってみると
しっかり表示されてるね!
これでOKだ!
ちなみに、
今回使うロックオン用の「SE」について音源は下記のURLからダウンロードしたよ
ほとんどを無料で商業利用が可能な、とても頼もしい音源配布サイトなんだFreesound - Interface Button Sound Pack by josheb_policarpio「著作者の名前」もしくは「素材へのURL」を明記すれば商用でも無料で利用が可能だから
もし他の効果音も気になったらのぞいてみてね
「敵(まと)」を作る
素材の用意ができたら
ロックオンする対象である「まと」を作ろう
「まと」のブループリントを作る
最初は
「コンテンツブラウザ」の「コンテンツ」にて「敵」をまとめるための
「Enemies フォルダ」を作ってね
フォルダができたら開いて、敵のブループリントを作ろう
「右クリック」⇒「ブループリント クラス」⇒「Actor」
を選択
生成された「ブループリント」の名前を「Target」と命名
これで敵のブループリントが用意出来たよ
「まと」の見た目を決める
もし既に「まとの見た目」を用意出来てるなら飛ばしてOKだ
今回はこんな感じの見た目にするよ
まずは「Target」を開いて
画面左側にある「コンポーネント」⇒「追加」⇒「球」を選択
すると、球体がでてくるので見た目はこれでOK
次に色を決めよう
「コンテンツブラウザ」に戻って
「右クリック」⇒「マテリアル」を選択
生成できたマテリアルを「M_Target」と命名
名前を付けたら「M_Target」を開いて
「M_Target ノード」の「ベースカラー」を
「右クリック」⇒「パラメーターへ昇格」
昇格で生成された「ベースカラーノード」を「ダブルクリック」すると色を調整できるよ
今回はわかりやすく赤にしよう
「ベースカラーノード」を作る要領でほかの要素もノード化できるよ
自分の好みに合わせてマテリアルを作ってみてね
できたら画面左上にある「適応」を押してね
これでマテリアルの設定はOKだ
最後にアクターの「Target」を開いて
「Sphere」の「詳細」内にある「マテリアル」に
さっき作った
「M_Target」に差し替えればOKだ
これで「Target」の見た目の設定OKだよ
「Tag」をつける
ロックオンする際に「敵」と「自分(味方)」を判別したいんだ
そのために、それぞれに「Tag」を付けて識別できるようにするよ
まずは「Target」に「Tag」を付けよう
「Target」を開いて
「コンポーネント」から「Target(Self)」を選択
「詳細」から「Tag」と検索し
「Tag」を設定できる「Tags」があるので
「+」を押して「インデックス」を生成
「インデックス[0]」に「Enemy」と記入すればタグ付け完了だ
「プレイヤーのブループリント」も同じようにTagを付けよう
プレイヤーのブループリントは以降から
「BP_PC」(Blueprint_PlayerCharacter)と呼称するよ
これで「Tag」付けはOKだ
「画面範囲ロックオンシステム」の入れ物を作る
今回作る「画面範囲ロックオンシステム」はかなり大きなシステムになるため
「BP_PC」に直接作るには窮屈なんだ
なので「外付けのシステム」として作り、「BP_PC」にくっつける形で実装していくよ
「Actor Component」を生成する
まずはその「外付けのBP」となる「Actor Component」を生成していこう
「コンテンツ」⇒「Blueprint」にて
「右クリック」⇒「ブループリント クラス」⇒「Actor Component」を選択
名前は「Screen Range Lock-On System」改め
「SRLO_System」とするよ
「Actor Component」と「BP_PC」を紐づける
次に「SRLO_System」を「BP_PC」にくっつけるよ
「BP_PC」の「コンポーネント」から
「追加」⇒「SRLO_System」を検索して選択
画像のように「SRLO_System」が表示されていたらOKだ
システムが紐づけできているかを確認する
まずは「SRLO_System」にてこんな感じにノードを組んでね
次に「BP_PC」にて
「コンポーネント」から「SRLO_System」を「ドラッグ&ドロップ」
出来た「SRLO_Systemノード」のピンから「Test」を検索して生成
こんな感じにノードを組んでね
できたら「プレイ」してみよう
「Q key」を押すたびに「Hello」が表示されるね
これで「紐づけ」の確認完了だ
できたなら、本格的に「SRLO_System」を組み立てにいこう
「Search Radar」を作って「アクター」に移行を取得してみる
「範囲内に入ったアクターを取得できる」ようにしよう
まずは「SRLO_System」に「Search Radar関数」を作ってね
作ったらもう使わない「Test ノード」は削除しよう
その後「Search Radar関数」にて
以下の変数を作ってね
作った変数名 | 型 | 値 | 内容 |
Player Pawn | Pawn | なし | 「プレイヤーのBP」から情報を引用する 「Get Plater Pawnノード」のReturnValueから「変数に昇格」で作れる |
Search Range | Float | 500 | 探知する当たり判定の範囲(距離)になる |
変数を作れたらこんな感じにノードを組んでね
できたら「BP_PC」に移動して
「Q key」を押したら「Search Radar関数」が起動されるようにしよう
これで組み立て完了
後は「フィルールド上」に「Target」を「ドラッグ&ドロップ」で置たら準備は完了だ
では早速プレイしてみよう
取得できてるんだけど… なんか多くない?
しかも「Enemy」でもないのにボタンを押すだけで「Hit=0」と表示される
変数の数え方としては「0」から始まるから
「0」が出てる時点で「何かを取得しているんだ」
なんでこうなっているのか…
というのも原因は単純明快
条件に「Enemyのみ」と設定してないから「壁」や「床」も取得してしまっているのだ
何もない場所と思ってても「床」が取得されてるから「Hit=0」と表示されたんだね
こりゃ良くない
ので、「Enemyのみ」を取得できるようにしよう
「Enemy」であるアクターだけを「取得」する
まずは2つの「変数」を用意してね
作った変数名 | 型 | 変数のタイプ | 値 | 内容 |
Enemy | Actor (オブジェクト参照) | 配列 | なし | 取得した「アクター」を保管する入れ物 これを出し入れすることで「ロックオン」相手を決める |
Tag Enemy | Name | 単一 | Enemy | タグと比べるための変数 「Enemy」と比べてそうであるかを判定する |
変数を用意出来たらこんな感じにノードを組んでね
これでプレイしてみよう
「Enemy」のみを取得できた!
けど…
なんか「 Q key」を押せば押すほど数字が増えるてくよ
どうしてこうなるのかと言えば
「同じアクターをもう1度取得している」からだね
データの重複はよくないから
今度は「同じアクターは取得しない」ようにしよう
「同じアクターは取得しない」ようにする
変数内に同じデータがあるかどうかを見てくれる
「Contains ノード」を使って組んでいこう
こんな感じにノードを組んでね
これで「プレイ」してみると
どんなに連打しても「Hit =3」以上は増えないね!
しっかり「0~3」までの「4つのEnemy」を取得できているよ!
やったね!
連続で「Search Radar」を行う
最後に、ゲームを開始した瞬間から「Search Radar」を連続で行うようにするよ
まずは「SRLO_System」の「EventGraph」にて
「initial startup」(初期起動)という「カスタムイベント」を作るよ
そしたらこんな感じに、ノードを組みつつ変数を作ってね
作った変数名 | 型 | 値 | 内容 |
Search Interval | Froat | 0.1 | 「Set Timer by Function Name」の 起動間隔を決める |
Search Radar Timer Handle | Timer Handle | なし | 「Set Timer by Function Name」の 実行を管理するノード |
これで起動すれば、毎0.1秒づつ「Search Radar関数」が実行されるようになるよ
ノードが組み終わったら次は「BP_PC」を開いて
こんな感じにノードを組んでね
これで準備は完了だ!
「プレイ」して挙動を確認してみよう!
うん!連続で「Search Radar」が起動できてるね!
これで「Q key」による手動での起動ともおさらばだ!
「画面範囲ロックオンシステム」の第一歩
「”レーダー”を作って敵を探知する」の完了だ!
やったね!
次回!マップ上の敵にマーカーをつける!
以上、
「画面範囲ロックオン」を作ってみようその1:レーダーを作って敵を探知する!
でした!
ここまで読んでくれてありがとね!
次回は「マップ上の敵に追尾する四角いマーカー」
を作っていきたいと思うよ!
下のボタンから次のページに進めるよから
よかったら見ていってね!
コメント