目次
はじめに
注意
UE5Preview2の現在の情報です。
今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。
解説
①砲弾ブループリントを作る
コンテンツブラウザ右クリックからブループリントクラスを選択します。

ウィンドウからActorを選択しましょう。
名前をBP_Cannonballにしましょう。

②コンポーネントの追加と編集
作成したブループリントを開きStaticMeshコンポーネントとProjectileMovementを追加します。

ProjectileMovement
アクタに移動やホーミングといった機能を付与するコンポーネント
StaticMeshにSphereを設定し
コリジョンプリセットをOverlapAllDynamicに変更します。

コリジョンとは当たり判定のことです。
アンリアルエンジンには以下の3種類の応答があります。
・コリジョンの判定を行わない無視
・当たったイベントのみを出して物理計算を行わないオーバーラップ
・当たったイベントと物理計算を行うブロック
これらがゲーム内のアクタすべてに設定されています。
OverlapAllDynamicはすべてのアクタと当たったイベントのみを出して物理計算を行わないプリセットです。
③BP_Cannonballの自壊プログラム
砲弾は発射するたびに増えていきます。
ゲーム上にアクタが大量に生成されるとどんどん重くなっていきます。
そういったことを防ぐためにストックしたものを使いまわすオブジェクトプールなどの考え方がありますが、今回は単純に一定時間たったら自身を消すようにします。
自壊と生成も負荷にはなりますので、ある程度ブループリントになれたらオブジェクトプールでの実装に挑戦してみてください。
イベントグラフに入り以下のようにノードを組みましょう。
BeginPlayはこのアクタが生成されたときに呼ばれるので5秒後に自身を削除します。

DestroyActor
ターゲットに入力されるアクタを破壊します。
④BP_Cannonからアクタ生成しよう
BP_Cannonのイベントグラフに入ります。
カスタムイベントを作成し名前をLaunchBallに変更します。

検索窓にSpawnと入力しクラスからアクタをスポーンしますを押します。

またSpawnTransformを右クリックして構造体ピンを分割を押します。

クラスからアクタをスポーン
その名の通りClassから選択されたアクタをTransformの位置に生成します。
CollisionHanding~は生成する場所にコリジョンがあった時にどうするかを設定します。
生成する位置は砲身の先端なので
画像のようにノードを配置します。

こちらのピンも分割します。

Scale以外を接続して
Scaleは0.2にしましょう。
またClassにBallクラスを指定します。

イベントを呼び出します。
今回はSetTimerを使ってみましょう。
前回の記事のイベントの最後に画像のように組みます。

Do Once
入力信号を一度だけ流します。
Resetが呼ばれるまで再度流れることはありません。
SetTimerbyEvent
指定した秒待って指定したイベントを呼び出します。
Loopingにチェックが入ると指定した時間おきにイベントを呼び出します。
これで一秒おきにLaunchBallが呼ばれるようになりました。
コンパイル後実行してみましょう。
砲身の先端から砲弾が生成されて落下するようになります。

⑤弾道予測に沿って砲弾を発射する
生成した砲弾にどうすれば予測線に沿った発射ができるでしょうか?
実はもうすでに弾に加えるベロシティーはそろっています。
前回組んだこのノードここから出力されるのは飛ばすためのベクトルだったのです。
つまりこの力を砲弾に加えればOKです。

接続するには距離が遠いので変数に昇格します。

ずらしてセットします。

LaunchBallイベントに戻り
生成されたBP_Cannonballの参照から追加されているProjectileMovementコンポーネントにアクセスしてベロシティーにセットしてあげましょう。

コンパイルして実行してみましょう。
弾道予測に沿って弾が移動しているのが分かります。

このままだと範囲外でも弾が出っぱなしなので
範囲外では弾を撃たないようにします。
発射にはタイマーを使っているのでこれを一時停止してあげればいいですね。
変数に昇格しましょう。名前をLaunchTimerにします。

範囲判定はここのブランチノードで行っていたのでFalseのときには一時停止させます。

逆に弾道予測可能になったら再開させてあげます。

⑥☆改良☆砲角度が弾道と一致しないと発射できないようにする。
補完速度を0.1などにすると戦艦などの重々しい大砲の動きにすることができますが、
下の画像のようにありえない角度で砲弾が射出されてしまいます。


そこで予測線のベクトルと砲角度のベクトルが一定以下にならないと発射できないように変更します。
補完する二つのベクトルの長さを求めてログ出力します。

5くらいがちょうどよさそうなので条件分岐を入れましょう。
また再開するタイマーのノードをDoOnece前に移動しておきます。

FalseにはPauseを追加しておきましょう。

実行して砲角度があってないときは発射されないことを確認しましょう。

⑦全体像






これで発射機構が完成しました。

ー 弾道予測線を予測しているッ!! ー
最後に
UE4やUE5向けの記事を書いています。
皆様の応援が投稿のモチベーションになりますので
コメントやTwitterのフォローなどしていただけるとありがたいです。
それではよきゲーム開発を。





