|
執筆バージョン: Unreal Engine 5.7.1
|
関連記事
[UE5]チャージショットで弾のバリエーションを増やそう!
[UE5]【続】弾のバリエーションを増やそう!~速射編~
◆はじめに
こんにちは、エンジニアの山中です。
前回記事では、カメラ方向に追従する弾を実装しましたが
問題点がいくつか残っていた為、今回は更なるブラッシュアップをしていこうと思います!

完成時の挙動
◆実装と問題点のおさらい
前回の実装状況は↓となります。
一見目的は達成しているように見えますが、下記のような問題が残っていました。
①弾を発射した後にプレイヤーが後ろに動くと弾が止まってしまう
↓のように、プレイヤーが動くと弾もその影響を受け、結果止まってしまいました。
②同時に複数の弾が発射できてしまう
これはこれで愉快なのですが、あくまでプレイヤーに操作させたいので1発づつ出るように制御したい!
ということで、それぞれ対応していきます。
◆プレイヤーの移動に依存しない実装へ
現在の実装から原因を探ります。

発射直後は5m先へ向かい、5秒後には20m先へ向かうようになっているのですが
この目的地を決める処理上で「プレイヤーのカメラ位置」をそのまま使用してしまっています。
これではプレイヤーが動くとカメラの位置も動いてしまい、結果目的地も変わってしまう…。
どうすれば良いのでしょうか。
ここで一度原点に立ち返ってやりたいことを洗い出してみましょう。
①弾は常に前進し続けるようにしたい
②弾の目的地を求めるにあたって、プレイヤーの動きに依存しない処理にしたい
③ベクトルを求めるにあたって、プレイヤーの位置とカメラを参照したい
③は今のままで問題無いですが、①②は現状
秒数で距離を制御していることが問題となるので、一度処理を外します。
また、弾の目的地を求める際にはカメラ位置が移動することも考慮するようにします。
具体的には、「カメラから一定距離離れた場所」ではなく
「カメラから(「カメラと弾の距離」+「弾からのオフセット距離」)分離れた場所」を目的地として設定するようにしましょう。

「カメラから離れた距離」の計算上でカメラ位置を考慮することで
結果的に常に弾自身の一定距離先が目的地となる処理となりました。
ニュアンス的には「馬の鼻先に人参をぶら下げる」ような感じです(?)。
新たに作成した変数「TargetDistanceOffset」は馬(弾)からどのくらいニンジン(目的地)を離すかの設定です。
今回は「100.0」で設定してみます。プレイすると↓のような挙動になります。
プレイヤーが後退しても弾が停止せず
また、常に弾の少し先を目的地にすることで
時間や距離に依存しない弾の挙動が実現できました!
ちなみに「TargetDistanceOffset」を小さくするほど機敏に、大きくするほどもっさり動くようになります。
◆同時発射数の制御
こちらに関しては、銃側のブループリントをざっと確認してみたのですが、それらしき設定項目は見当たりませんでした。
そもそも現実世界の銃ではそういった機構はありませんし
発射した弾の状態を見る必要がある為、専用の処理を追加することになりそうです。
まずは発射した弾の参照を持つ必要がある為、銃の基底クラスのブループリント「BP_ShooterWeaponBase」に処理を追加します。
↓の画像のアセットを開きます。

↓の手順で変数を作成します。

名前は分かりやすく「Bullet」としておきましょう。
これで「Bullet」変数に発射された弾の情報が保持されるようになりました。

次にグレネードランチャーのブループリント「BP_ShooterWeapon_GrenadeLauncher」を開きます。

イベントグラフを開いたら下記の通り、弾を発射する際の関数「FireBullet」をオーバーライドします。

↓のように関数が追加されていればOK!

オレンジ色のノードを通ることで、親クラスの弾発射処理が行われるのですが
ここに判定を追加し「既に弾が存在する場合は発射させない」ようにします。
まずは基底クラスに追加した「Bullet」変数のGetノードを作成します。

作成したらノードを「検証済みゲットに変換」します。

最後に↓のようにノードを組んで完成です!

注意点としては、弾が存在しない時に発射させたい為
「Is Valid」ではなく「Is Not Valid」の方を親クラスの「Fire Bullet」に繋げてください。
プレイすると↓のような挙動になります。
※筆者は猛連打しています
◆さいごに
↓最終的な挙動。操作性が向上しました!
いかがでしたか?
UEがバージョンアップするにつれ、テンプレートも要素が増え格段に進化しました。
今回は一部の弾の挙動を変えたに過ぎませんが
敵の動きやギミック等、オリジナリティを出すポイントは様々です。
是非テンプレートを使って色々なゲームを作ってみてください!