BLOGブログ

2024.12.11UE5UE/ 初心者向けUE/ Blueprint

[UE5]難易度変更に対応したシューティングゲームを作ってみよう

執筆バージョン: Unreal Engine 5.4

こんにちは!
今回は、簡単なシューティングゲームを作りながら、敵パラメーターを選択した難易度によって変える実装の一例をご紹介します。


プロジェクト作成

「FirstPerson」テンプレートを使用して、任意の名前でプロジェクトを新規作成します。


敵のブループリント作成

①BPの作成

「FirstPerson」テンプレートには、シューティングゲームとして基本挙動が既に実装されていますので、
まずは弾を当てて倒せる敵を追加実装することでよりゲームっぽくしていきましょう。

Pawnクラス継承のブループリントを作成します。名前は「BP_Enemy」としました。

②スケルタルメッシュコンポーネントの追加

「BP_Enemy」を開き、左上にあるコンポーネントに「Skeletal Mesh」を追加します。
※今回はマネキンを敵に使用するため「Skeletal Mesh」を使用しますが、的などの物を使う場合は「Static Mesh」を追加しましょう

スケルタルメッシュコンポーネントの詳細欄から「Skeletal Mesh Asset」を追加しましょう。
しかし、今回は「FirstPerson」テンプレートで作成したため、マネキンのスケルタルメッシュがありません。

スケルタルメッシュを使用するため、「ThirdPerson」テンプレートを追加していきます。
コンテンツブラウザ左上の「Add」から「Add Feature or Content Pack…」を選択します。

「ThirdPerson」テンプレートを選び、プロジェクトに追加します。

再度「BP_Enemy」の「SkeletalMesh」コンポーネントを選択し、詳細欄から好きなスケルタルメッシュを選択しましょう。
今回は「SKM_Quinn」を設定しました。

せっかくなので、「Anim Class」に「ABP_Quinn」を設定して待機アニメーションをするようにしておきます。

また、このままだと少し見づらいので、色を変えていきます。
SkeletalMeshを設定してから、コンパイルをすると詳細欄にマテリアルインスタンスが表示されます。
虫メガネマークをクリックして、マテリアルインスタンスのあるフォルダまで移動しましょう。

「MI_Quinn_01」と「MI_Quinn_02」をそれぞれCtrl+Dで複製して、「MI_Quinn_03」「MI_Quinn_04」を作成します。

それぞれのマテリアルインスタンスを開き、詳細欄の「01 – BaseColor>Tint」にチェックを入れ、好みの色に変更しましょう。

「BP_Enemy」に戻って作成したマテリアルインスタンスを設定します。
見やすくなりましたね!

③当たり判定の追加

続けて、当たり判定を作っていきます。
「Capsule Collision」コンポーネントを追加しましょう。

カプセルコリジョンのサイズを変更します。
今回は以下の数値にしてみました。

  • LocationZ:90
  • Capsule Half Height:90
  • Capsule Radius:35

④ダメージ処理の実装

弾が当たった時の処理を追加していきます。
カプセルコリジョンコンポーネント詳細欄下部にあるEvents内の「On Component Hit」横にある+ボタンを押します。

イベントグラフに移動するので、まずはInteger型の変数「MaxHp」「CurrentHp」を追加しましょう。
変数を追加後はコンパイルを押してください。

「MaxHp」を選択して詳細欄の「Instance Editable」「Expose on Spawn」のチェックを入れ、Default Valueを「-1」にしておきます。

On Component Hitノードから以下の処理を追加します。
カプセルコリジョンにヒットしたのが「BP_FirstPersonProjectile」であれば「CurrentHp」を1減らし、「CurrentHp」が0になったタイミングで消えるようにしています。

このままでは「CurrentHp」と「MaxHp」が同期されておらず、「MaxHp」を変更しても「CurrentHp」が変わってくれません。
Begin Playノードから以下の処理を追加して、最初は必ず MaxHp=CurrentHp になるようにします。

⑤テストプレイ

ここで一旦テストしてみましょう。
レベルの適当な位置に「BP_Enemy」を置いて、詳細欄から「MaxHp」を適当な値に変更してプレイを押します。

無事に機能していますね!
ただ、このままだと敵の残りHPが分かりにくいです。この後追加する機能の確認のためにも、暫定的に可視化しておきましょう。

⑥HP表示の追加

「TextRender」コンポーネントを追加します。
表示場所やサイズ、色などをお好みで変更してください。

イベントグラフに移動して、テキストを更新する関数「SetHp」を作成します。
以下のようにノードを追加してください。

Begin PlayOn Component Hitに作成した「SetHp」を追加しましょう。
スポーンした時と、HPが減少したが0ではない時にテキストを更新するようになります。

⑦再テスト

再度テストしてみましょう。
HPが可視化されてだいぶ分かりやすくなりました。


難易度選択

①レベル作成

さて、ここまでで敵のBPを作成できました。次は難易度を選択する機能を実装します。
【難易度選択レベルで難易度選択】 ⇒ 【「FirstPersonMap」を開いて敵がスポーン】
という流れにするため、新規の空レベル「DifficultySelect」を作成しましょう。

②Enumeration(列挙型)作成

難易度はEnumeration(列挙型)で作成します。
コンテンツブラウザ上で[右クリック] > [BluePrint] > [Enumeration]を選択し、名前を「E_Difficulty」とします。

「E_Difficulty」を開き+ボタンで要素を追加します。
今回は「EASY」「NORMAL」「HARD」の3種で進行します。

③GameInstance作成

レベル間で選択した難易度を保持したいので、GameInstanceに難易度を保存する必要があります。
[Setting] > [Project Settings] > [Maps & Modes] > [Game Instance Class] 横の+ボタンを押して新しいGameInstanceのBPを作成します。
名前は「BP_MyGameInstance」としました。

 

「BP_MyGameInstance」を開き、E_Difficulty型の変数「Difficulty」を作成しましょう。

難易度を保存する関数「SetDifficulty」を作成し、「BP_MyGameInstance」を閉じます。

④難易度選択ウィジェット作成

難易度を選択するためのウィジェットを作成していきましょう。
コンテンツブラウザ上で[右クリック] > [User Interface] > [Widget BluePrint] > [User Widget]を選択し、
名前を「WB_DifficultySelect」とします。

「WB_DifficultySelect」を開き、難易度を選択するためのボタンを3つ追加します。
今回は画像のように配置を行いました。

各ボタンの詳細欄下部の[Events] > [On Clicked]横の+ボタンからイベントを作成します。

難易度を選択したらGameInstanceに保存し、「FirstPersonMap」を開くように処理を追加します。

「DifficultySelect」のレベルブループリントを開き、Begin Playノードから「WB_DifficultySelect」を表示するようにします。

⑤構造型作成

続いて、敵のパラメーターの構造型を作成します。
コンテンツブラウザ上で[右クリック] > [Blueprint] > [Structure]を選択し、名前を「ST_EnemyParam」としました。

「ST_EnemyParam」を開き、Integer型の変数「MaxHp」を追加します。
Default Valueは「-1」にしておきましょう。

⑥データテーブル作成

難易度毎のパラメーターを設定するデータテーブルを作成します。
コンテンツブラウザ上で[右クリック] > [Miscellaneous] > [Data Table]を選択し、
先ほど作成した構造体「ST_EnemyParam」を使用して作成します。
名前を「DT_EnemyParam_Easy」「DT_EnemyParam_Normal」「DT_EnemyParam_Hard」としました。

 


敵のスポーン

さて、ここからは「FirstPersonMap」に戻り、レベル読み込み時に任意の場所に敵をスポーンする仕組みを実装していきます。

①TargetPoint配置

[Place Actors (アクタを配置)]から「Target」などで検索して、「TargetPoint」をレベル上に配置しましょう。
※開いていない場合、メインメニューで [Window] > [Place Actor]を選択で開けます。
このポイントに敵をスポーンさせます。

今回は10カ所に設置しました。

②スポーン処理実装

「FirstPersonMap」のレベルブループリントを開きます。

敵をスポーンさせる関数「SpawnEnemy」を追加しましょう。
この関数は、TargetPointの配列に対応するデータテーブルの数値を取得して、「BP_Enemy」をTargetPointの位置にスポーンさせます。
その際、MaxHpの値が「-1」の場合はスポーンしないようにしています。

イベントグラフに戻り、TargetPoint型の配列「TargetPoints」を追加します。
Begin Playノードから以下の処理を追加しましょう。
TargetPointの配列を作成し、GameInstanceから取得した難易度によって分岐させます。

※アウトライナーもしくはレベル上でターゲットポイントを全て選択して
 レベルブループリントのイベントグラフ上で [右クリック] > [Create References to 10 selected Actors] を選択すると
全てのリファレンスが同時に追加できます。

これで全ての実装が完了しました!
データテーブルにパラメーターを入れてテストしてみましょう。

③パラメーター設定

各難易度のスポーンさせる敵のMaxHpを設定していきます。
RowNameは1~連番にしてください。(レベルに置いたターゲットポイントと対応しています)
「-1」の場合、そのポイントにはスポーンしません。

④最終テスト

テストしてみると…

上手く機能していますね!
これでデータテーブルからパラメーターを変更するだけで簡単にバランス調整が出来そうです。
また、パラメーターの追加にも簡単に対応できるので、理想の体験に向けてどんどんブラッシュアップを繰り返していきましょう!


本ブログでの実装はここまでとなりますが、このゲームには他にも色んな機能を追加できそうですね。
敵を倒したらクリアにしたり……敵が動いたり攻撃してきたり……ワクワクしてきますね!

それでは、皆さんのゲーム制作ライフがより良きものとなりますように!