シンプルなタワーディフェンスゲームを作る part13
こちらのようなシンプルなタワーディフェンスゲームを作っています。本記事では前回作ったウェーブ制御処理を拡張し、ウェーブに含まれる敵を全て倒したら次のウェーブを開始する処理を作ります。
コンセプト
前回作ったウェーブ管理機能では「ウェーブマネージャー」がデータテーブルを読み込み、そのウェーブ情報を複数の「敵スポナー」に伝え、「敵スポナー」がそれに従い敵ユニットを出現させる仕組みにしました。
今回は「ウェーブマネージャー」いくつの「敵スポナー」に指示をしたか記憶し、「敵スポナー」が何体の「敵ユニット」を出現させたかを記憶します。
各「敵スポナー」が記憶している数の「敵ユニット」が倒されたら、「ウェーブマネージャー」にウェーブが終了したことを報告します。「ウェーブマネージャー」が記憶している全ての「敵スポナー」から報告を受けたらそのウェーブを終了し次のウェーブを開始、または次のウェーブが無ければゲームクリアとします。
複数のウェーブ情報をデータテーブルに追加する
前回は1つのウェーブしか作成しませんでしたが、今回はウェーブを進められることを確かめるために、複数のウェーブを用意します。
「DT_wave」を開き、下図のように2ウェーブ目と3ウェーブ目を作成します。
ウェーブマネージャー側の処理を追加する
「BP_wave_manager」を開きます。
前回は下図のようなイベントグラフを作成しました。今回は下図①~④に処理を追加します。
Integer型 「max_wave_count」、Integer型 「finished_spawner_count」を作成します。
①「Event BeginPlay」の続きに、「wave_number」がこれまでで最も大きいか判定し、最も大きい場合、その値を「max_wave_count」に代入する処理を追加します。
これで、そのステージの最大ウェーブを取得します。
今回の例の場合は3が代入されます。
②「call_next_wave」の初めの部分で、「finished_spawner_count」を0で初期化し、「wave_count」が「max_wave_count」以下か判定し、Falseの場合は全てのウェーブが終了する処理を作ります。今回は「print」で代用していますが、将来的にここにゲームクリア処理を作ります。
③「enemy_spawner」に「set_wave」をするところに、「finished_spawner_count」をインクリメントする処理を加えます。
これで各ウェーブでいくつの「enemy_spawner」にウェーブを作る指示を出したかをカウントします。
今回の例では1ウェーブ目は2つ、2ウェーブ目は1つ、3ウェーブ目は2つが記憶されます。
④「Add Custom Event」で新規イベントを作成し、名称を「finished_wave_of_sqawner」とします。「finished_spawner_count」をデクリメントし、0以下になったら「call_next_wave」を呼ぶことで、次のウェーブを開始します。
敵スポナー側の処理を追加する
「BP_enemy_spawner」を開きます。
前回は下図のようなイベントグラフを作成しました。今回は下図①~③に処理を追加します。
①「Event BeginPlay」で「BP_wave_manager」を取得し変数として記憶します。(part2を参照)
②Interger型変数「enemy_count」を作り「set_wave」で0に初期化します。
③イベント「spawn_enemy」の続きに処理を追加します。
「Bind Event to On Destroyed」ノードを追加し「Target」に「Spawn AI From Class」の「Return Value」を繋ぎます。
これでスポーンさせた「敵ユニット」が倒されたときにイベントを発火することが出来ます。
次に「enemy_count」をインクリメントします。
「Add Custom Event」で新規イベントを作成し、名称を「enemy_destroyed」とします。「enemy_destroyed」の続きに「enemy_count」をデクリメントし、「enemy_count」が0以下になったら「wave_manager」の「finished_wave_of_sqawner」を呼ぶようにします。
ここまで実装したら、冒頭の動画のように、データテーブル通りに「敵ユニット」が出現し、各ウェーブの全ての「敵ユニット」が倒された後、次のウェーブが呼ばれる振る舞いを確認することが出来ます。
コメント