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

手順13 ーエネミーの情報を利用してプレイヤーの拠点の耐久力を減算する制御の実装ー
27.EnemyController スクリプトを修正し、エネミーに攻撃力を設定する
28.DefenseBase スクリプトを修正し、耐久力の値をエネミーの攻撃力分だけ減算する処理に書き換える



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

 ・TODO 機能



27.EnemyController スクリプトを修正し、エネミーに攻撃力を設定する

1.設計


 拠点とエネミーによる侵入判定が実装できましたので、この手順では、エネミーのゲームオブジェクトに攻撃力の設定を行い、
拠点に侵入した際に、固定値ではなく、侵入したエネミーの攻撃力の分だけ耐久力を減算するように処理を変更します。

 また先の手順のことをふまえて、処理の中に TODO 機能を利用して、実装予定の処理を記述しておくようにします。

 エネミーの攻撃力、ということになりますので、エネミーのゲームオブジェクトにアタッチされている EnemyController スクリプトにこの情報を設定します。
これも、エネミーのゲームオブジェクトとバレットのゲームオブジェクトと侵入判定の時と同じ内容の実装方法です。

 エネミーのゲームオブジェクト自体に攻撃力を設定することはできませんが、エネミーのゲームオブジェクトとしての振る舞いを与えている
EnemyController スクリプトに攻撃力の値を設定することによって、エネミーに攻撃力の情報を与えることが可能になります。

 この考え方は今後も何回も出てきますので、スクリプトによってゲームオブジェクトに情報を与える、というイメージをつかんでください。


2.EnemyController スクリプトを修正し、エネミーの攻撃力を設定する



 設計に基づいて、EnemyController スクリプトを修正して、攻撃力用の変数を宣言します。
public 修飾子で宣言しておくことによって、インスペクターより設定が可能になりますので、活用してください。

 攻撃力の値は拠点の耐久力に対して計算を行う対象になりますので、自ずと宣言する型も決まります。
以前にも学習しましたが、変数を作成する場合には、どんな目的に利用するのかを明確に設定してから作成してください。
利用する目的を把握していれば、それを元に変数の名前を付ける際にも参考になりますので、イメージを作ることが大切です。


EnemyController.cs


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

 EnemySet ゲームオブジェクトのインスペクターを確認して、新しく public 修飾子で宣言した変数が表示されているか確認します。


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




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


 EnemySet ゲームオブジェクトのインスペクターより、EnemyController スクリプトに追加された、エネミーの攻撃力の値を設定します。
先ほどまでは固定値で 10 でしたので、別の値にした方が分かりやすくなります。今回は 50 に設定してください。


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



 以上で設定は完了です。



28.DefenseBase スクリプトを修正し、耐久力の値をエネミーの攻撃力分だけ減算する処理に書き換える

1.設計


 拠点にエネミーが侵入すると現在は耐久力の値が 10 減算するように処理を実装しています。
エネミー側に攻撃力の設定を追加しましたので、この処理を、耐久力の値をエネミーの攻撃力の値分減算する処理に書き換えていきます。

 この処理の設計についても、バレットとエネミーの実装処理と同じ方法で考えてみてください。
侵入してきたゲームオブジェクトはエネミーですが、ゲームオブジェクト自体は攻撃力の値を持ちません
そのため、侵入ゲームオブジェクトの情報からさらに、そのゲームオブジェクトにアタッチされている EnemyController スクリプトの情報を取得する必要があります。
取得した情報は変数に代入して利用します

 攻撃力の値は public 修飾子にて宣言している変数ですので、今回のように、外部のスクリプト(今回は DefenseBase スクリプト)においても参照することが可能です。


2.DefenseBase スクリプトを修正し、侵入判定の際に耐久力の値をエネミーの攻撃力分だけ減算する処理に書き換える


 今後は特に記載がなくても、日本語でコメントを記述してから処理を書いていくことを心がけてください。
繰り返して学習を行っていくことで、ロジックの考え方を覚えていくことが出来ます。


<コメントの参考例>
    private void OnTriggerEnter2D(Collider2D col) {

        if (col.gameObject.tag == "Enemy") {

            // 侵入してきたコライダーのゲームオブジェクトに EnemyController スクリプトがアタッチされていたら取得して enemy 変数に代入
            

            // 耐久力の値をエネミーの攻撃力分、減算する
            

            // 減算結果の値を Console ビューに表示して計算されているか確認
            Debug.Log("残りの耐久力 ; " + durability);

            // エネミーのゲームオブジェクトを破壊する
            Destroy(col.gameObject);
        }
  }



 前回学習した、TryGetComponent メソッドも利用してみましょう。


DefenseBase.cs

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


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


3.<TODO機能>


 後々実装を行いたい処理のために、TODO(トゥードゥー) という記述をコメントしておくことで、VisualStudio のタスク管理から一覧表示して確認することが出来るようになります。
書き換える予定の処理や、後で実装を行いたい場所については、この TODO 機能を利用してください。

 詳しい使い方はこちらです。  =>  TODO機能


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


 すべての実装が終了しましたので、ゲームを実行してエネミーを拠点まで移動させて侵入判定を発生させてください。
固定値ではなく、エネミーに設定した攻撃力分だけ耐久力の値が減算されて、その結果が Console ビューに表示されれば制御成功です。


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


 エネミーの攻撃力の値を変更して、色々と処理の動きを確認してみてください。



5.DefenseBase スクリプトに追記した処理をメソッド化する


 今回追記した処理について、新しくメソッドを作成して、その中で処理を行うように変更しましょう。

 EnemyController スクリプトの際もそうでしたが、OnTriggerEnter2D メソッド内の if 文節で取得している EnemyController スクリプトの情報は
別のメソッドには引き継がれませんので、利用することが出来ません

 そのため、新しいメソッドにて EnemyController スクリプトの情報を利用するためには、引数を利用してください。
このメソッド化の手順も EnemyController スクリプトの実装手順が参考になります。

 一連の処理をメソッドにまとめる方法、メソッドの引数を利用する方法はプログラムを作成する際に必要な手法です。
復習しながら学習を進めてください。
 

DefenseBase.cs

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


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

 ゲームを実行して、今まで同じ処理が実行されていることを確認してください。



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


 次は 手順14 ー耐久力用のゲージと数字表示の作成と、スクリプトによる制御処理の実装ー です。