本記事は「UE5_Ver5.3.2」で制作しているよ
本記事は「UE5_Ver5.3.2」で制作しているよ
また、前提条件として「射撃システム」と「敵を配列に追加する」
を実装する必要があるよ
まだしてないのなら下記のURLから飛んで見てみてね【前提条件その1:射撃システム】
【前提条件その2:配列追加システム】
こんにちは!ウンパッパです!
今回は
中央のレティクルに合わせなくても
「弾丸が自動で敵に向かって発射される」システムを作っていくよ!
まずは完成した際の動画を見てみよう!
「自動で」配列に取得した「敵」に「銃弾が発射」されているね!
そして「銃口」と「敵」の間に何かあった場合は
弾丸がまっすぐ飛ぶように切り替わるよ!
やっていることとしては
まず「球状の当たり判定」を作り当たった敵を「配列に追加」
「配列内にいる敵」ならば「弾丸が敵に向かって射撃する」ようにするんだ
もし「配列に追加」を作ってないならこの記事から配列追加を作りに行ってね
それでは早速行ってみよう!
「Fire Socket」を作る
今回作る「敵に向かって弾丸発射」は
今から作る「Fire Socket(弾丸発射口)」が「回転しながら弾を生成する」ことによってできているんだ
なのでまずは「回転できる弾丸発射口」を作りに行こう
「レベルエディタ」にて「Scen Component」という「BP」を作ってね
名前を「Fire_Socket」にするよ
次に、「Fire_Socket」を「BP_PC(PlayerCharacter)」に適応していくよ
「BP_PC」を開いたら
「コンポーネント」⇒「追加」から
「Fire_Socket」を追加
階層を「Weapon」の下に置いてね
そしたら位置調整
「ビューポート」にて「銃口の前」になるように置いてね
回転も、銃に向かって真っすぐにしよう
次に、「射撃システム」で作った弾丸生成システム
その発射元を「Fire_Sicket」に差し替えて行こう
これでOKだ
「プレイ」してみよう
問題なく射撃ができてるね
OKだ
敵に向かって弾丸を撃つ
弾丸が敵に向かうようにしてみよう
やっていることとしては
「”敵”が居たら”敵”に向かって射撃」
「”敵”が居無いなら”前”に向かって射撃」
ということをしているよ
まずは
「”敵”が居無いなら”前”に向かって射撃」
を作りに行くよ
「射撃システム」にて、こんな感じにノードを組んでね
もともとあった「弾丸を生成するノード」を「Branch」の「False」につないでる形だよ
次に「”敵”が居たら”敵”に向かって射撃」
「Branch」の「True」にこんな感じのノードを組んでね
これでOKだ
「プレイ」してみよう
うん!
「敵」がいるなら「敵」に向かって射撃できてるね!
ただ、キャラの向きによっては弾が自分に当たってしまうね
これはよろしくないので修正しに行こう!
銃口と敵の間に何かあるなら追尾しないようにする
やり方としては「プレイヤー」と「敵」を「Line Trace By Channel」で線でくっつけて
線の間に何かあった場合「前射撃」になるようにするよ
「プレイヤー」専用の「Trace Channel」を作る
まずは「Line Trace By Channel」に使う
「プレイヤー」専用の「Trace Channel」を作りに行こう
「レベルエディタ」の右上にある「設定」⇒「Project設定」にて
「Trace Channel」と検索
「新規のトレースチャンネル」を作りに行こう
名前を「Player」
応答を「Block」にして
承認しよう
こんな感じになったらOK
コリジョン設定を変更する
次に「プレイヤー」、「敵」、「弾丸」の「コリジョン設定」を変更しよう
まずは「プレイヤー」
「コンポーネント」⇒「Capsule Component」にて「Collision」を検索
「コリジョンプリセット」を「Custom」にし
「Player」の欄は「ブロック」にチェックを入れよう
これでOK
次に「敵」
「Player」の欄は「無視する」にチェックを入れる
最後に「弾丸」
「Player」の欄は「オーバーラップ」にチェックを入れる
これで設定完了だ
「銃口と敵の間に何かあるか?」を作る
最後に「敵の配列取得」で作った「GAR_System」をいじりにいこう
まずは「GAR_System」の「イベントグラフ」にて「BP_PC」の変数を扱えるようにしよう
作った変数名 | 型 | 値 | 内容 |
As BP Player Character | BP Player Character | なし | 「BP_PC」のデータを引用し、その変数を扱えるようにする |
次に「Search Radar関数」にて「銃口と敵の間に何かあるか?」を作りにいこう
全体図はこんな感じ
まずは「銃口の位置」を取りに行こう
こんな感じにノードを組んで変数を作ってね
作った変数名 | 型 | 値 | 内容 |
Fire Socket Location | Vector | なし | 「Fire_Socket」の位置を取得 「Line Trace by Channel」の位置設定のために使う |
つぎに「敵の配列追加」にてこんな感じにノードを組んでね
【注意】
もし「Trace Channel」に「Player」が無い場合は、1度「Trace Channleノード」を生成してねそうするとデータが読み込まれて作った「Player」が表示されるよ
できたら次は「配列排除」
こんな感じにノードを組んでね
出来たらOKだ
「プレイ」してみよう
「プレイヤー」や「壁」含め
「銃口」と「敵」の間に何かあった場合は「前射撃」になるね
ただ「プレイヤー」が回転した際、処理が間に合わないのか自爆してるね
なので最後は「弾丸による自爆の防止」を作りに行こう
弾丸に自爆防止をつくる
方法としては「タグ=Frend」なら「当たり判定」を「無視する」
という設定にしていくよ
まずは「射撃システムをつくろう!」にて作った「Projectile」を開いて
弾丸に「Tag」をつけるよ
「コンポーネント」から「Homing_Projectile(Self)」を選択して
「詳細」から「Tag」と検索し
「Tags」にて「Index0」を生成し「Frend」という値にするよ
次に「イベントグラフ」にて「Event BeginPlay」からこんな感じにノードを組んでね
これで「Frend」なら「当たらない」設定になったよ
ただこれだけだと足りないんだ
おそらくなんだけど
「当たらない」よりも「破壊属性」の方が「優先度」が高いのか
現状、アクターだったら当たるか当たらないか「考える前に破壊」してしまうのだ
弾丸くん破壊衝動にまみれてるね
なので「Branch」を使って「Enemy」かどうかを考えさせてあげよう
「On Component Begin Overlapノード」からこんな感じにノードをを組んでね
これで設定完了だ
ちなみに「Frend(プレイヤー)なら実行しないBranch」があるなら
これだけで「Destroy Actor」発動しないんじゃないか?と思うかもしれないが残念なことに「なぜか自滅する」
おそらく
「On Component Begin Overlapノード」の「当たり判定で起動」という条件が
なんやかんやで「Branch」を無視してるみたいなので「プレイヤー属性の付与」と「Branchによる敵の判別」両方実装しないとダメなんだ
出来たので早速「プレイ」してみよう
うん!
どんなに回転してもプレイヤーに当たってエフェクトを表示させないね!
これにて「敵に向かって弾丸が発射するシステム」の完成だ!
やったね!
おわりに
以上!
【UE5】レティクル合わせなくても自動で当たる!敵に向かって弾丸が発射する方法!【TPSシューター】
でした!
ちなみに、
これのシステムの応用として
「予測した敵の移動先に向けて弾丸を発射する」を解説しているから
よかったら見て行ってね!
【現在鋭意制作中です!】
それでは次の記事にて、またね!
コメント