ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【ゼロからアンリアルエンジン5】 ⑫プレイヤーを狙う大砲を作ろう=砲弾の作成と発射=

目次

 

はじめに

注意

UE5Preview2の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

解説

①砲弾ブループリントを作る

コンテンツブラウザ右クリックからブループリントクラスを選択します。

f:id:namiton:20220310153315p:plain

ウィンドウからActorを選択しましょう。

名前をBP_Cannonballにしましょう。

f:id:namiton:20220310153503p:plain

 

コンポーネントの追加と編集

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

f:id:namiton:20220311113813p:plain

 

ProjectileMovement

アクタに移動やホーミングといった機能を付与するコンポーネント

f:id:namiton:20220311114022p:plain

 

StaticMeshにSphereを設定し

コリジョンプリセットをOverlapAllDynamicに変更します。

f:id:namiton:20220311114417p:plain



コリジョンとは当たり判定のことです。

アンリアルエンジンには以下の3種類の応答があります。

コリジョンの判定を行わない無視

・当たったイベントのみを出して物理計算を行わないオーバーラップ

・当たったイベントと物理計算を行うブロック

これらがゲーム内のアクタすべてに設定されています。

 

OverlapAllDynamicはすべてのアクタと当たったイベントのみを出して物理計算を行わないプリセットです。

f:id:namiton:20220311114729p:plain

 

③BP_Cannonballの自壊プログラム

砲弾は発射するたびに増えていきます。

ゲーム上にアクタが大量に生成されるとどんどん重くなっていきます。

そういったことを防ぐためにストックしたものを使いまわすオブジェクトプールなどの考え方がありますが、今回は単純に一定時間たったら自身を消すようにします。

自壊と生成も負荷にはなりますので、ある程度ブループリントになれたらオブジェクトプールでの実装に挑戦してみてください。

 

イベントグラフに入り以下のようにノードを組みましょう。

BeginPlayはこのアクタが生成されたときに呼ばれるので5秒後に自身を削除します。

f:id:namiton:20220311115552p:plain

 

DestroyActor

ターゲットに入力されるアクタを破壊します。

f:id:namiton:20220311115711p:plain

 

④BP_Cannonからアクタ生成しよう

BP_Cannonのイベントグラフに入ります。

カスタムイベントを作成し名前をLaunchBallに変更します。

f:id:namiton:20220311120207p:plain

 

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

f:id:namiton:20220311121954p:plain



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

f:id:namiton:20220311122019p:plain



 

クラスからアクタをスポーン

その名の通りClassから選択されたアクタをTransformの位置に生成します。

CollisionHanding~は生成する場所にコリジョンがあった時にどうするかを設定します。

f:id:namiton:20220311120742p:plain

 

生成する位置は砲身の先端なので

画像のようにノードを配置します。

f:id:namiton:20220311122050p:plain

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

f:id:namiton:20220311121240p:plain

Scale以外を接続して
Scaleは0.2にしましょう。

またClassにBallクラスを指定します。

f:id:namiton:20220311122134p:plain

イベントを呼び出します。

今回はSetTimerを使ってみましょう。

前回の記事のイベントの最後に画像のように組みます。

f:id:namiton:20220311122206p:plain

 

Do Once

入力信号を一度だけ流します。

Resetが呼ばれるまで再度流れることはありません。

f:id:namiton:20220311122320p:plain

 

SetTimerbyEvent

指定した秒待って指定したイベントを呼び出します。

Loopingにチェックが入ると指定した時間おきにイベントを呼び出します。

f:id:namiton:20220311122452p:plain

 

これで一秒おきにLaunchBallが呼ばれるようになりました。

コンパイル後実行してみましょう。

砲身の先端から砲弾が生成されて落下するようになります。

f:id:namiton:20220311122638p:plain

 

⑤弾道予測に沿って砲弾を発射する

生成した砲弾にどうすれば予測線に沿った発射ができるでしょうか?

実はもうすでに弾に加えるベロシティーはそろっています。

前回組んだこのノードここから出力されるのは飛ばすためのベクトルだったのです。

つまりこの力を砲弾に加えればOKです。

f:id:namiton:20220311122955p:plain

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

f:id:namiton:20220311123125p:plain

ずらしてセットします。

f:id:namiton:20220311123223p:plain

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

f:id:namiton:20220311123450p:plain

コンパイルして実行してみましょう。

弾道予測に沿って弾が移動しているのが分かります。

f:id:namiton:20220311123600p:plain

このままだと範囲外でも弾が出っぱなしなので

範囲外では弾を撃たないようにします。

発射にはタイマーを使っているのでこれを一時停止してあげればいいですね。

変数に昇格しましょう。名前をLaunchTimerにします。

f:id:namiton:20220311124329p:plain

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

f:id:namiton:20220311124607p:plain

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

f:id:namiton:20220311124715p:plain

⑥☆改良☆砲角度が弾道と一致しないと発射できないようにする。

補完速度を0.1などにすると戦艦などの重々しい大砲の動きにすることができますが、

下の画像のようにありえない角度で砲弾が射出されてしまいます。

f:id:namiton:20220311132005p:plain

f:id:namiton:20220311131947p:plain

そこで予測線のベクトルと砲角度のベクトルが一定以下にならないと発射できないように変更します。

補完する二つのベクトルの長さを求めてログ出力します。

f:id:namiton:20220311132243p:plain

5くらいがちょうどよさそうなので条件分岐を入れましょう。

f:id:namiton:20220311132758p:plainまた再開するタイマーのノードをDoOnece前に移動しておきます。

f:id:namiton:20220311132815p:plain

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

f:id:namiton:20220311133119p:plain

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

f:id:namiton:20220311132835p:plain

 

⑦全体像

f:id:namiton:20220311133234p:plain

f:id:namiton:20220311133304p:plain

f:id:namiton:20220311133313p:plain

f:id:namiton:20220311133338p:plain

f:id:namiton:20220311133354p:plain

f:id:namiton:20220311133409p:plain

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

f:id:namiton:20220311124818p:plain

ー 弾道予測線を予測しているッ!! ー

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。