i-school - 2Dタップシューティングゲーム 手順24
 この手順からはゲームのベースとなるサイクルを実装していきます。
ゲームはスタートしてから終了するまでを1サイクルとし、それを繰り返して遊べるような作りになっています。

 ここからはゲーム終了の判定を利用して、ゲームクリアとゲームオーバーの処理について実装を行っていきます。
まずは最初にその前提となる条件の作成から実装します。

 以下の内容で順番に実装を進めていきます。

手順24 −エネミーの生成完了状態とボスの討伐状態の追加とゲーム終了判定の実装−
50.EnemyGenerator スクリプトを修正して、生成したエネミーが一定数に達したら生成を終了する制御を追加する
51.EnemyGenerator スクリプトを修正して、ボス討伐状態を追加し、ゲーム終了状態に切り替える制御を追加する



 新しい学習内容は、以下の通りです。

 ・Debug.Log メソッドを利用した処理の流れの確認方法
 ・StartCoroutine メソッド



50.EnemyGenerator スクリプトを修正して、生成したエネミーが一定数に達したら生成を終了する制御を追加する

1.設計


 現在はエネミーが無制限に生成されているので、こちらを制御するようにします。

 エネミーの生成は EnemyGenerator スクリプトにて制御されていますので、こちらに設定を追加しましょう。
どのようにして制限を加えるかですが、そのためには条件として利用できる情報の作成が必要になります。
これはどのような制御の方法を実装するか、ゲームのシステムとするかによって変わる部分です。

 色々な制御方法が考えられますが、今回は一定数のエネミーの生成が終了した時点でエネミーの生成を停止するように設計を行います。
(例えば時間での制限や倒した数での制限など、この部分は多くの設計が考えられます。)
 
 現在、生成したエネミーの数はカウントしていますが、このエネミーの生成数を「一定数」と指定する情報がありません。
そこで、このエネミーの生成数という部分と比較する情報として「エネミーの最大生成数」という情報を作成して条件とするようにします。

 エネミーの生成が行われるたびにエネミーの生成数が加算されていった際に、その生成数が「エネミーの最大生成数」の値と同じかそれ以上になったら
そこで生成を停止するようにする、という制御方法です。 

 また、このエネミーの最大生成数に達した場合には、「エネミーの生成完了」という情報を変数で用意しておいて、こちらの制御を行うようにしましょう。
そうすればスクリプト内で「エネミーの生成完了」という情報をつかった制御を利用することが出来ます。
これを上手く活用して、生成の処理を停止するように考えましょう。

 エネミーの生成の処理には生成の準備処理があります。生成を停止する場合には、この準備の処理自体を停止することを考えてください。
制御を行いたい場合には根本的な処理の部分から制御を行うことが効果的な制御処理になります。


2.EnemyGenerator スクリプトを修正して、生成したエネミーが一定数に達したら生成を行わないようにする制御を追加する


 どのような情報が必要か考えながら変数を作成し、制御文を作成して、設計のような条件を満たす処理のロジックを組んでみてください。
エネミーの生成が終了した際にエネミーの生成数をカウントアップしていますので、この部分が生成数と最大生成数とを比較して制御する対象となります。

 また生成の準備の処理は Update メソッドにありますので、こちらをどのようにすれば制御できるかを考えてロジックを組んでみてください。


EnemyGenerator.cs

 <= クリックすると開きます。



 スクリプトを修正したらセーブします。
EnemyGenerator ゲームオブジェクトのインスペクターを確認し、EnemyGenerator スクリプトの情報を確認します。
新しく public 修飾子で宣言した変数の表示が追加されていれば問題ありません。

EnemyGenerator ゲームオブジェクト インスペクター画像




3.EnemyGenerator ゲームオブジェクトの設定を行う


 EnemyGenerator ゲームオブジェクトを選択し、インスペクターより EnemyGenerator スクリプトの maxGenerateCount 変数に条件となる数を設定します。
あまり多いとデバッグが大変になりますので、3 〜 5 前後で設定しておきましょう。

 isGeerateEnd 変数は false のままで問題ありません。この変数がエネミーの生成数が最大生成数(maxGenerateCount)に達したときに true に切り替われば制御成功です。


EnemyGenerator ゲームオブジェクト インスペクター画像




4.ゲームを実行して動作を確認する


 EnemyGenerator スクリプトの maxGenerateCount の値の回数だけエネミーが生成されたら、
Console ビューに生成完了が表示されて、エネミーの生成が停止すれば制御成功です。

 EnemyGenerator ゲームオブジェクトの インスペクターを確認し、isGeerateEnd 変数が true に切り替わっているかも確認しておきましょう。


<実行動画>
動画ファイルへのリンク


 続いては、今後のためにボス討伐用の状態を作成し、ゲームの全体の流れを確認する処理を作成していきます。


51.EnemyGenerator スクリプトを修正して、ボス討伐状態を追加し、ゲーム終了状態に切り替える制御を追加する

1.設計


 この手順では Debug.Log メソッドを利用して、ボス出現時の演出、ボスの生成処理、そしてボス討伐までの一連のゲームサイクルの流れを作成して確認します。

 ゲームのサイクルを考えたときに、1つずつ順番に実装していくのはもちろんですが、全体の流れを把握しておくことも大切になります。
今回はこの全体の流れを Debug.Log メソッドを利用して順番に処理が実行されていく状態を把握することが目的です。

 また TODO 機能も利用し、どの部分にどんな処理を記述していくのかをイメージします。
処理の流れが把握できたら順番に処理のロジックを組みこんで実装していくようにします。

 実際にこの部分で実装するのは「ボス討伐」という状態の情報を作成して、利用する方法を設計します。
全体の流れは次のようになります。

 △エネミーの生成数が最大生成数になって「エネミーの生成完了」の状態になったら、ボスの出現時の演出を Debug で実装する
 △出現する演出終了後に、ボスの生成を行う。Debug で実装する
 〇ボス討伐の状態を討伐済の状態に切り替える。これは実際に情報を作成して利用する
 〇ボス討伐済の状態になったら、GameManager スクリプトの isGameUp 変数を切り替えてゲーム終了の状態にする。これも実装する

 上記の流れを実装します。△部分は Debug を活用します。
〇部分は実際に実装を行い、最終的にボス討伐済の状態になったら GameManager スクリプトの isGameUp 変数を切り替えることが目的です。

 isGameUp 変数は切り替えるためのメソッドが用意してありますし、EnemyGenerator スクリプトも GameManager スクリプトの情報を変数で取得していますので
切り替えるメソッドをどのタイミングで呼び出すようにするかが大切になります。


2.EnemyGenerator スクリプトを修正して、ボス討伐状態の追加を行い、この値を利用してゲーム終了状態を切り替える制御を追加する


 設計に基づいて、処理を記述してみてください。


EnemyGenerator.cs

 <= クリックすると開きます。


 スクリプトを修正したらセーブします。
EnemyGenerator ゲームオブジェクトのインスペクターを確認し、EnemyGenerator スクリプトの情報を確認します。
新しく public 修飾子で宣言した変数の表示が追加されていれば問題ありません。

EnemyGenerator ゲームオブジェクト インスペクター画像



4.ゲームを実行して動作を確認する


 エネミーの生成完了後、Console ビューにボス出現時の演出表示、ボスの生成表示、ボス討伐の表示が順番に表示されて
EnemyGenerator スクリプトの isBossDestroyed 変数と GameManager スクリプトの isGameUp 変数両方とも true に切り替われば制御成功です。

 この流れによって、ゲームのサイクル化が成功することがわかりました。
今後も自分でゲーム製作を行う際には、いきなりすべての処理を実装することはできませんので、
このように処理の流れを事前に作成しておくことで、実装していく際の順番や段取りをつけやすく、ロジックも組みやすくなります。


<実行動画>
動画ファイルへのリンク


 以上でこの手順は終了です。

 次は 手順25 −ボスの作成と生成処理の実装− です。