|
執筆バージョン: Unreal Engine 5.7
|
今回は第25回ぷちコンのテーマ「とう」にちなんで、簡易的なタワーディフェンスを作ってみましょう!
タワーディフェンスは自分の拠点に迫ってくる敵を、砲台などを設置して倒すことで拠点を守るゲームです。
完成イメージはこちら!
プロジェクトを用意しよう
まずはTopDownテンプレートでプロジェクトを作成します。

自動的に初期レベル(Lvl_TopDown)が開きます。
「プレイボタン」を押すとゲームプレイが始まります。Esc キーを押すとゲームプレイが停止します。

続いて、今回作成するアセットの保存先フォルダを作成します。
画像のようなコンテンツブラウザ上の何もないところを右クリックして新規フォルダを作成します。

フォルダが作成されたら、「TowerDefense」という名前にしておきます。(名前はなんでもいいです)

次に、レベル上に配置された不要なメッシュを削除しておきます。
アウトライナータブにあるSM_Cubeを選択した状態で、Shiftキーを押しながらSM_Ramp12を選択します。
Deleteキーを押して選択中のメッシュを削除します。


固定カメラを作成しよう
デフォルトではカメラがプレイヤーキャラクターに追従するので、固定カメラに変更します。
コンテンツブラウザからTowerDefenseフォルダを開き、何もないところを右クリックしてブループリントクラスをクリックします。

開いたウィンドウでCameraActorを検索してクリックし、選択ボタンをクリックします。

名前を「BP_Camera」とし、ダブルクリックして開きます。

画面右側の詳細パネルからAuto Activate for PlayerをPlayer0に設定します。

コンテンツブラウザから「BP_Camera」をドラッグ&ドロップし、右下のプレビューを見ながらカメラ位置を調整します。

「プレイボタン」を押して動作確認してみましょう。

動画のような視点になっており、画面をクリックしても視点が移動しなくなっていれば成功です。
本拠地を作成しよう
防衛対象となる本拠地を作成していきます。
コンテンツブラウザ上の何もないところを右クリックしてブループリントクラスをクリックします。
開いたウィンドウでアクターをクリックします。

名前を「BP_Tower」とし、ダブルクリックして開きます。

コンポーネントタブから追加をクリックし、キューブをクリックしてメッシュを追加します。

追加したCubeを選択した状態で、詳細タブからコリジョンプリセットをNoCollisionに設定します。

次に、コリジョンを追加します。
コンポーネントタブから追加をクリックし、検索欄からBoxCollisionを検索してクリックします。

詳細タブから以下の設定を行いコリジョンの位置と大きさを調整します。
- トランスフォーム > 位置でz成分を50に設定
- トランスフォーム > 拡大・縮小を1.75に設定

敵を作成しよう
本拠地に向かっていく敵を作成します。
まず、敵が使用するアニメーションを用意します。
コンテンツブラウザーからコンテンツ > Characters > Mannequins > Anims > Unarmedフォルダを開きます。
ABP_Unarmedを右クリックして複製を選択します。

複製されたファイルの名前を「ABP_Enemy」とし、ダブルクリックで開きます。

イベントグラフタブにあるEvent Blueprint Update Animation内の処理で対象のノードを画像のように繋ぎ変えます。
敵に適用した際、Get Current Accelerationで取得される加速度が常に0になり、アニメーションが再生されなくなるためこの対応を行います。

ここからは敵のクラスを作成していきます。
コンテンツブラウザ上の何もないところを右クリックしてブループリントクラスをクリックします。
開いたウィンドウでキャラクターをクリックします。

名前を「BP_Enemy」とし、ダブルクリックして開きます。

コンポーネントタブからMeshをクリックした状態で、詳細タブから以下の項目を設定します。
- メッシュ > Skeletal Mesh AssetにSKM_Manny_Simpleを設定
- Animation > AnimクラスにABP_Enemyを設定
- トランスフォーム > 位置のz成分を-80に設定
- トランスフォーム > 回転のz成分を-90に設定

続いて、変数を作成していきます。
イベントグラフタブをクリックしてイベントグラフを開きます。
変数の右にある+をクリックして追加された変数の名前を「HP」とし、変数の型をFloatに設定します。

この変数にデフォルト値を設定するため一度コンパイルボタンを押し、デフォルト値 > HPに3.0を設定します。


ここからは敵の処理を作成していきます。
まずは「HPからダメージを引いて0以下になったらアクターを削除する」処理を作成します。
イベントグラフの何もないところを右クリックし、Event Any Damageを選択して追加します。

変数「HP」をドラッグ&ドロップして、Get HPを選択します

HPのピンからドラッグしてSubstractノードを追加します。

AnyDamageノードのDamageピンからドラッグしてSubstractノードにつなげます。
その後、変数「HP」をドラッグ&ドロップしてSetHPノードを追加します。

SetHPノードの実行ピンからドラッグしてBranchノードを追加します。

SetHPノードのデータピンからドラッグしてLessEqualノードを追加します。

LessEqualノードのピンをBranchノードに接続し、Branchノードの実行ピンからドラッグしてDestroyActorを追加します。

処理全体は画像のようになります。

次に、「敵が本拠地まで移動する」処理を作成します。
BeginPlayノードの実行ピンからGet Actor Of Classノードを追加し、ActorClassにBP_Towerを設定します。

GetActorOfClassノードからIsValidノードを追加します。

IsValidノードからAI Move Toノードを追加します。

AI Move ToのTargetActorピンとGet Actor Of Classのピンを接続し、PawnピンからドラッグしてSelfノードを追加します。

次に、「BP_Towerと衝突した際にBP_Towerを破壊し、自分自身を削除する」処理を作成します。
コンポーネントタブからCapsule Componentを選択した状態で、詳細タブのイベント > On Component Begin Overlap横の+をクリックします。

イベントグラフにOn Component Begin Overlapが追加されるので、以下のような処理を作成します。

敵の移動処理を確認してみましょう。
BP_EnemyとBP_Towerをドラッグ&ドロップでレベルに配置し、プレイして確認してみましょう。


動画のように動作していれば成功です。
弾を作成しよう
後ほど作成する砲台が発射する弾を作成します。
コンテンツブラウザ上の何もないところを右クリックし、ブループリントクラスをクリックします。
開いたウィンドウでアクターを選択し、名前を「BP_Bullet」とした後ダブルクリックで開きます。

コンポーネントタブから追加をクリックし、球をクリックしてメッシュを追加します。

追加したメッシュを選択した状態で、詳細タブからコリジョンプリセットをNoCollisionに設定します。

また、拡大・縮小から弾のサイズを任意の大きさに調整しておきます。

コンポーネントタブの追加ボタンからSphereCollisionとProjectileMovementを追加します。

SphereCollisionを選択した状態で詳細タブから位置、拡大・縮小を変更してコリジョンの大きさを調整します。

続いて、ProjectileMovementを選択した状態でInitial Speedを2000、弾が重力で落下しないようにProjectile Gravity Scaleを0に設定します。

ここからは「BP_Enemyと衝突した際にダメージを与え、弾自身を削除する」処理を作成していきます。
コンポーネントタブからSphereを選択した状態で、詳細タブのイベント > On Component Begin Overlap横の+をクリックします。

イベントグラフにOn Component Begin Overlapが追加されるので、以下のような処理を作成します。

砲台を作成しよう
最後に砲台を作成していきます。
コンテンツブラウザ上の何もないところを右クリックし、ブループリントクラスをクリックします。
開いたウィンドウでアクターを選択し、名前を「BP_Turret」とした後ダブルクリックで開きます。

コンポーネントタブから追加をクリックし、キューブをクリックしてメッシュを追加します。

同様にシリンダーのメッシュを追加します。

Cylinderを選択した状態でトランスフォームを変更してそれらしい見た目になるよう調整します。

次に、コンポーネントタブの追加ボタンからSphereCollisionを追加します。
詳細タブ > トランスフォーム > 拡大・縮小の値を40程度に設定しておきます。

ここからは砲台の処理を作成していきます。
まずは「BP_EnemyがSphere内に入ってきた際にターゲットとして登録する」処理を作成します。
コンポーネントタブからSphereを選択した状態で、詳細タブのイベント > On Component Begin Overlap横の+をクリックし、
イベントグラフにOn Component Begin Overlapノードを追加します。

次に、変数の右にある+をクリックして追加された変数の名前を「TargetEnemy」とし、
変数の型をBP_Enemyのオブジェクト参照に設定します。

On Component Begin Overlapノードに以下のような処理を作成します。

「ターゲットとして登録中BP_EnemyがSphereから出た際にターゲットを解除する」処理を作成します。
コンポーネントタブからSphereを選択した状態で、詳細タブのイベント > On Component End Overlap横の+をクリックします。

イベントグラフにOn Component End Overlapが追加されるので、以下のような処理を作成します。

「砲台が敵の方を向く」処理を作成していきます。
まず、Event Tickノードから以下のような処理を作成します。

×ノードのピンを右クリックして浮動小数点数(単精度)を選択し、値として0.5を設定します。

設定後のノードは画像のようになります。

以下の箇所それぞれに対して右クリックして構造体ピンを分割を選択します。
- Get Actor Rotationの出力ピン
- Find Look at Rotationの出力ピン
- ×の出力ピン
- +の入力ピン
- Set Actor Rotationの入力ピン

分割されたピンを画像のように接続してください。

「一定間隔で弾を発射する」処理を作成していきます。
まず、変数にFloat型の変数を2つ追加し、それぞれFireInterval、FireIntervalMaxとします。

一度コンパイルボタンを押してからFireIntervalMaxのデフォルト値を0.5(値は任意のもの)に設定します。

先ほど作成した敵の方を向く処理のSet Actor Rotationから繋げて、以下のような処理を作成します。

砲台を配置して動作確認しよう
前項で作成したBP_Turretをドラッグ&ドロップでレベルに配置し、プレイして確認してみましょう。

まとめ
今回は敵と砲台が1つずつでしたが、敵が一定時間ごとにスポーンするようにしたり、
プレイヤーが砲台を複数設置できるようにしたりすればよりタワーディフェンスらしくなると思うので、
ぜひ試してみてください。