i-school - 2Dタップシューティングゲーム 発展7
 以下の内容で順番に実装を進めていきます。

発展7 −GameData の活用−
13.GameData スクリプトを修正し、耐久力やエネミーの生成数などのゲームの設定関連の値を、このスクリプトに集約して設定し、各スクリプトから参照する制御処理を追加する
14.DefenseBase スクリプトと EnemyGenerator スクリプトを修正し、GameData スクリプトから設定された値を受け取ってゲームに反映する方法に変更する



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

 ・ゲームの設定関連の値を1つのスクリプトに集約し利用する方法



13.GameData スクリプトを修正し、耐久力やエネミーの生成数などのゲームの設定関連の値を、このスクリプトに集約して設定し、各スクリプトから参照する制御処理を追加する

1.設計


 GameData クラスはシングルトンクラスですので、外部のスクリプトからの参照情報が取得しやすいです。

 この手順では、拠点の耐久力や、エネミーの最大生成数といった、各スクリプトに個別に設定して利用していたゲームの設定情報を
GameData クラスに集約し、GameData クラスで設定した情報を、各スクリプトが参照して受け取って利用していく、という設計に変更します。

 各スクリプトに設定情報があるということは、何か変更がある場合や確認を行う際には、それぞれのスクリプトを変更したり、ヒエラルキーで確認する必要がありました
それは今までの設計上では仕方のないことでしたが、GameData クラスを作成したことにより、このクラスを中心に、ゲームの設定を用意するように変えることが可能です。



 DefenseBase スクリプトで管理していた耐久力の値の変数と、EnemyGenerator スクリプトで管理していたエネミーの最大生成数の変数を
それぞれ同じ型で GameData クラスに用意します。この値もインスペクターで設定可能な SerializeField 属性を付与して宣言を行います。

 こうすることで、いままで設定を行う際に、各スクリプトのアタッチされているゲームオブジェクトを選択して設定するという動作を
GameData クラスのアタッチされている GameData ゲームオブジェクトのインスペクターからまとめて変更出来るようにします。


<完成図>




 あとはこの情報を DefenseBase スクリプトや EnemyGenerator スクリプトで利用できるように、
GameData クラスに、それぞれの値の戻り値を持つメソッドを作成して、そのメソッドを各スクリプトより呼び出して必要な値を取得する方法に処理を変更します。

 ここでは処理を変更しながら、シングルトンクラスの利用方法と、戻り値を持つメソッドの利用方法を復習します。

 処理の修正方法は、今までと同じです。
ロジックとしては DefenseBase スクリプトと EnemyGenerator スクリプトの修正が必要になりますが、
最初に GameData クラスを修正して、耐久力の値とエネミーの最大生成数の値の情報を追加し、それらのスクリプト用にメソッドを用意します。

 それから、各スクリプトを修正して完成させていきます。


2.GameData スクリプトを修正する


 設計に基づいて、DefenseBase スクリプトの耐久力の情報と、EnemyGenerator スクリプトのエネミーの最大生成数の情報を変数として宣言します。
インスペクターで設定できるように、SerializeField 属性を付与することを忘れないでください。
各スクリプトと同じ変数名でもよいですが、わかりやすさを考えて、変数名の最後に 〜Base のように修飾語を追加しておくと見やすくなります。

 GetTotalExp メソッドを参考にしながら、同じように耐久力の値とエネミーの最大生成数の値の情報を取得できる、ゲッターメソッドを作成しましょう。
このメソッドを外部のスクリプトが呼び出すことによって、GameData クラスに設定した各設定情報を取得できる設計になります。

 イメージを作ってから処理を記述しましょう。もちろん、先に記述してから教材を確認していただいても構いません。


GameData.cs


 スクリプトを記述したらセーブします。

 GameData ゲームオブジェクトのインスペクターを確認します。
新しく SerializeField 属性で宣言した変数が追加されていることを確認します。


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




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


 GameData ゲームオブジェクトのインスペクターより、GameData スクリプトに新しく表示されている変数に情報を設定します。
現在の拠点の耐久力とエネミーの最大生成数を参考に、異なる値で入力してください。変更されたときに分かりやすくするためです。


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



 以上で設定は完了です。


14.DefenseBase スクリプトと EnemyGenerator スクリプトを修正し、GameData スクリプトから設定された値を受け取ってゲームに反映する方法に変更する

1.設計


 GameData クラスに、いままで DefenseBase スクリプトと EnemyGenerator スクリプトで設定していた値を追加しました。
各スクリプトでは、個別に設定を行うのではなく、現在のそれらの変数に GameData クラスの各情報を取得して利用するように処理を変更します。

 それぞれのスクリプトには SetUp〜 で始まるメソッドがあります。
これは Start メソッドの代わりとなる、各スクリプトの最初に実行するべき情報を記述するメソッドになっています。
今回の処理はゲームに必要な情報の設定処理になりますので、まさに最初に実行するべき内容です。
これらのメソッド内処理を追加していきましょう。


2.DefenseBase スクリプトを修正し、GameData スクリプトに設定した耐久力の値を受け取ってゲームに反映する処理に変更する


 設計に基づいて、SetUpDefenseBase メソッドに、durability 変数に GameData クラスの durabilityBase 変数の値を取得するように処理を追加します。
値の取得には GameData クラスに用意した GetDurability メソッドを利用して、戻り値を使って代入してください。

 処理を記述する場所を考えて、自分で記述してみてください。


DefenseBase.cs

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


 スクリプトを修正したらセーブします。


3.EnemyGenerator スクリプトを修正し、GameData スクリプトに設定した耐久力の値を受け取ってゲームに反映する処理に変更する


 設計に基づいて、SetUpEnemyGenerator メソッドに、maxGenerateCount 変数に GameData クラスの maxGenerateCountBase 変数の値を取得するように処理を追加します。
値の取得には GameData クラスに用意した GetMaxGenerateCount メソッドを利用して、戻り値を使って代入してください。

 こちらも始めは処理を記述する場所を考えて、自分で記述してみてください。


EnemyGenerator.cs

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


 スクリプトを修正したらセーブします。


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


 実装が終了しましたのでゲームを実行し、DefenseBase スクリプトの durability の値と、EnemyGenerator スクリプトの maxGenerateCount の値が変更されることを確認します。

 どちらのスクリプトも SetUp メソッド内で GameData クラスに設定した情報を取得し、それを利用する方式に変更しました。
ゲーム実行時に、これらの値が GameData クラスで設定した値に変更されれば制御成功です。


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


 各スクリプトのインスペクターではなく、GameData クラスのインスペクターを設定するだけで、設定が反映できるようになりました。
このように設定用の処理を集約しておくことで、修正する場合には常に GameData のインスペクターを変更するだけで済むような設計に出来ます。

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

 次は 発展8 −エネミーの移動方法を追加− です。