i-school - 2Dタワーディフェンス 手順11
 この手順では、防衛用の味方キャラに攻撃範囲を作成し、その範囲内に敵キャラが侵入した際に破壊する処理を実装します。
まずはこの処理を実装することによって、攻撃範囲内に敵キャラを感知する、という処理が完成します。
そして次の手順で、敵にダメージを与えるようにし、ダメージによって破壊される、というように順番に処理を組み立てていきます。

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


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


手順11 ー味方キャラの攻撃範囲の設定と敵キャラの破壊処理の実装ー
18.Chara ゲームオブジェクトを修正する
19.CharaController スクリプトの修正を行い、攻撃範囲内に侵入した敵キャラを破壊する処理を実装する



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

 ・Collider を攻撃範囲として利用する
 ・OnTriggerStay2D メソッド



18.Chara ゲームオブジェクトを修正する

1.設計


 防衛用のキャラのゲームオブジェクトに攻撃範囲の情報を設定するように設計を考えます。

 もっとも実装しやすい方法は、新しく子オブジェクトを1つ Create Empty で作成して、それにコライダーをアタッチすることです。
コライダーの判定方法にはスクリプトのメソッドを利用しますので、それに合わせて IsTrigger のスイッチを切り替えます。

 タワーディフェンスでは敵キャラが経路に沿って移動を行いますので、防衛用のキャラの攻撃範囲は、その経路をカバーする形状であることが理想です。
そのため、BoxCollider2D コンポーネントを利用して、広く、経路をカバーできる状態で作成しておきます。

 敵キャラにも同じようにコライダーを追加することによってコライダー同士の判定が行えるようになりますが、
敵キャラが攻撃範囲用のコライダーに侵入するためには、攻撃範囲用の BoxCollider2D の IsTrigger のスイッチをオンにしておく必要があります。
そうしないと、敵キャラは侵入できず、見えない攻撃範囲用のコライダーに接触し、そこで移動を停止するようになってしまうためです。



 以上のような設計をふまえて、防衛キャラ側には新しく CharaController スクリプトを1つ作成してアタッチします。
その中でトリガー型の判定が可能な OnTriggerStay2D メソッドを実装します。このメソッドはコライダーを持つゲームオブジェクトが、
コライダー内に侵入した際に、侵入している間ずっと自動的に処理を行うメソッドです。すべてのコライダーに反応するため、Tag による分岐を用意し、
敵キャラのコライダーのみを判定するようにします。

 Tag による分岐が必要なのはなぜでしょうか? 
例えば、防衛用のキャラが2体並んでいる場合、それぞれのコライダーに反応してしまい、誤作動を起こしてしまうためです。
それを回避するため、OnTriggerStay2D メソッドが実行された場合には、まず、Tag による判定を行う必要性があります。

 OnTrigger 〜 で始まる名前のメソッドは、Rigidbody2D コンポーネントがアタッチされていないと動作しません。
そのため、防衛用のキャラのゲームオブジェクトには、Rigidbody2D コンポーネントを追加しておく必要があります。

 これまでの設計をまとめます。

<Chara ゲームオブジェクト>
 1.Chara ゲームオブジェクトに Rigidbody2D コンポーネントを追加する
 2.Chara ゲームオブジェクトの子オブジェクトを1つ作成し、その子オブジェクトに BoxCollider2D コンポーネントを追加し、IsTrigger にチェックを入れる
 3.CharaController スクリプトを作成し、OnTriggerStay2D メソッドを実装する

<Enemy ゲームオブジェクト>
 4.Enemy の Tag を追加する。この情報で侵入したコライダーを持つゲームオブジェクトが敵キャラであると判定するため
 5.Enemy ゲームオブジェクトに BoxCollider2D コンポーネントを追加する

 それでは、1〜2の処理について最初に実装し、続いて、3〜5の処理を実装していきます。


2.Chara ゲームオブジェクトの設定を変更する


 Prefabs フォルダ内にある Chara ゲームオブジェクトを選択して、インスペクターの一番上にある Open Prefab ボタンを押してプレファブの編集モードに切り替えます。

 インスペクターの一番下にある Add Component ボタンを押して Rigidbody2D コンポーネントを追加してください。

 BodyType を Kinematic に変更して、重力などの外部からの物理演算の影響を受けないようにします。

 Constraints プロパティ欄の中にある Freeze Rotation の Z にチェックを入れます
これによってゲームオブジェクトが回転することを防止しておきます。


インスペクター画像


 以上で Chara ゲームオブジェクトの設定は完了です。


3.Chara ゲームオブジェクトの子オブジェクトとして AttackRangeArea ゲームオブジェクトを作成する


 引き続き、Chara ゲームオブジェクトを修正していきます。

 Chara ゲームオブジェクトの上で右クリックをしてメニューを開き、Create Empty を選択します。
新しいゲームオブジェクトが子オブジェクトとして作成されますので、名前を AttackRangeArea に変更します。
 

プレファブ内の構造



 AttackRangeAttack ゲームオブジェクトのインスペクターを確認し、Add Component ボタンを押して
BoxCollider2D コンポーネントを追加してください。

 IsTrigger のスイッチにチェックを入れて、トリガーを有効にします。

 Size が (1, 1) になっていますので、(5, 5) に変更してください。これが防衛用のキャラの攻撃範囲となります。


インスペクター画像



Sceneビュー画像



 子オブジェクトに設定したコライダーの判定は、親オブジェクトに Rigidbody2D コンポーネントがアタッチされていると判定を有効化できます。

 以上で設定は完了です。


19.CharaController スクリプトの作成を行い、攻撃範囲内に侵入した敵キャラを破壊する処理を実装する

1.設計


 先ほどの設計の手順のうち、3〜5の部分を順番に実装していきます。

<Chara ゲームオブジェクト>
〇1.Chara ゲームオブジェクトに Rigidbody2D コンポーネントを追加する
〇2.Chara ゲームオブジェクトの子オブジェクトを1つ作成し、その子オブジェクトに BoxCollider2D コンポーネントを追加し、IsTrigger にチェックを入れる
 3.CharaController スクリプトを作成し、OnTriggerStay2D メソッドを実装する

<Enemy ゲームオブジェクト>
 4.Enemy の Tag を追加する。この情報で侵入したコライダーを持つゲームオブジェクトが敵キャラであると判定するため
 5.Enemy ゲームオブジェクトに BoxCollider2D コンポーネントを追加する

 どのような処理を組み合わせることでゲーム上の機能として実装が行えるかをイメージしながら作っていくことが大切です。


2.CharaController スクリプトを作成する


 Scripts フォルダ内で右クリックをしてメニューを開き、Create => C# Script を選択し、名前を CharaController に変更します。
OnTriggerStay2D メソッドを実装し、コライダー同士の侵入判定を行えるようにしましょう。

 今後実装する処理については、TODO 機能を利用して記述しておくと便利です。
次に実装したい処理が他にもあれば、自分でどんどんと記述しておきましょう。


CharaController.cs


 スクリプトを作成したらセーブを行います。


3.Chara ゲームオブジェクトに CharaController スクリプトをアタッチする


 Prefabs フォルダにある Chara ゲームオブジェクトを選択し、インスペクターの一番上にある Open Prefab を押してプレファブ編集モードに切り替えます。

 作成した CharaController スクリプトをドラッグアンドドロップして、Chara ゲームオブジェクトにアタッチします。


インスペクター画像



 以上で設定は完了です。


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


 ヒエラルキーにある Empty ゲームオブジェクトを選択してください。

 2つ設定を行います。
 
 最初に Tag の設定を行います。新しく Enemy タグを作成して、Enemy ゲームオブジェクトの Tag として設定を行います。
CharaController スクリプト内の Tag の判定に利用していますので、同じ大文字・小文字の Enemy を登録してください。


Tags & Layers インスペクター画像



 続いて、BoxCollider2D コンポーネントの追加を行います。
インスペクターの一番下にある Add Component ボタンを押して、BoxCollider2D コンポーネントを追加してください。

 IsTrigger のスイッチにチェックは不要です。
OnTriggerStay2D メソッドは、侵入しているいずれかのコライダーに IsTrigger がチェックされていれば反応します。
すでに AttackRangeArea ゲームオブジェクトの BoxCollider2D の IsTrigger にチェックが入っているので、こちらはチェックなしで問題ありません。

 コライダーの Size は (1, 1) のままで問題ありません。自動的に (1, 1) の Size にならない場合には修正してください。
 

インスペクター画像



 以上で設定は完了です。


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


 どのような挙動になれば制御が成功しているのか、イメージを作ってからゲームを実行してください。
また、自分でゲームを製作する場合には、どういった手順でこれらの実装を行っていったのかを覚えておくと役立ちます。

 最初からすべてを上手く組み立てることは出来ませんし、ロジックの構築は難しい作業です。
今回のように手順を自分で考えて、1つずつ順番に組み立てて作っていくようにしてください。

 ゲームを実行したら、敵キャラが移動してきますので、配置可能な地点をクリックして防衛用の味方キャラを配置します。
設定してある AttackRangeArea ゲームオブジェクトの BoxCollider2D の Size 内に敵キャラが侵入した場合、そのゲームオブジェクトを破壊すれば制御成功です。


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


 上手くいかない場合には、Chara ゲームオブジェクトと Enemy ゲームオブジェクトの設定の見直しを行ってみましょう。
また、CharaController スクリプトに記述した OnTriggerStay2D メソッドのつづりが間違っていないか、引数が間違っていないか、など検証してみてください。
OnTriggerStay2D メソッドと OnTriggerStay メソッドは異なる働きをしますし、引数の型も異なります。



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

 次は 手順12 −味方キャラの攻撃処理と敵キャラのダメージ処理の実装− です。