簡単な2Dシューティングゲーム作成の第4回目を進めていきます。今回はマトとなる敵の生成と弾の当たり判定を追加していきます。
はじめに
今回で第4回目です。第1回目は下記から
簡単なおさらいと今回やる事
前回まで、画面を作成してボタン押すと「機体が動き」、「弾が発射」できるようにしました。今回はマトとなる敵を生成して、弾が当たると消えるようにしていきます。
ゲーム作成開始
では、さっそく敵となるマトを作成していきます。
マトの作成
まずは仮となるマトを用意します。Imagesフォルダ内で右クリック。作成から「2D」→「スプライト」→「カプセル」を選びます。

名前をTargetにしてヒエラルキーにドラッグアンドドロップ。スケールを調整しておきます。

マト(敵)を動くようにする
次にこのマトを動くようにします。イメージとしては上から出てきて下に落ちていく感じですね。Scriptsフォルダ内で右クリック。作成から「C#スクリプト」を選択し、Targetと言う名前でファイルを作成します。

Tartgetスクリプトの中身は下記のように変更。下に場所を移動しているだけです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Target : MonoBehaviour { void Update() { transform.position -= new Vector3(0, 1.5f * Time.deltaTime, 0); } }
このスクリプトをTargetにくっつけます。

一旦、動かしてみて下に動けばOK。
マトとなる敵は何個も出てくるので、プレハブ化しておきます。ヒエラルキーからPrefabsフォルダ内にドラッグアンドドロップ。

マトの生成位置
次にマトの生成位置を調整します。機体から出る弾の場合、機体の先端に生成位置を設定しました。同じように、マトの生成位置はゲーム画面の上の方にします。TargetPointという空のオブジェクトを追加して、少し枠外に位置を設定しておきます。

次に、マトを生成していくので「TargetCreate」と言う名前で新しくスクリプトを作成。

スクリプトの中身は下記のように変更。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TargetCreate : MonoBehaviour { public GameObject prefabTarget; void Start() { Instantiate(prefabTarget, transform.position, transform.rotation); } }
このTargetCreateスクリプトをTargetPointにくっつけます。変数には「Targetプレハブ」を指定。

これで一度実行して上から出てこればOK。
マトを複数生成し生成位置をランダムにする
現状だとマトが真ん中から一回出るだけなので調整していきます。まずは出てくる位置をランダムに変更します。横の位置だけをランダムにしていきます。下記のようにTargetCreateスクリプトを変更。
//using System.Collections; using System.Collections.Generic; using UnityEngine; public class TargetCreate : MonoBehaviour { public GameObject prefabTarget; void Start() { Vector3 TargetPosition = new Vector3(Random.Range(-2.3f, 2.3f), transform.position.y, transform.position.z); Instantiate(prefabTarget, TargetPosition, transform.rotation); } }
この辺は、unityのスクリプトリファレンスの使い方とほぼ同じ感じですね。
次に、マトが複数出るようにします。色々な方法がありますが、とりあえず一定周期で無限に出るようにしています。ここは「マトをどうしたいか」で結構変わる気がします。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TargetCreate : MonoBehaviour { public GameObject prefabTarget; private float fInterval = 2f; private float fTime = 0; void Update() { fTime += Time.deltaTime; if (fTime >= fInterval) { RandomTargetCreate(); fTime = 0; } } private void RandomTargetCreate() { Vector3 TargetPosition = new Vector3(Random.Range(-2.3f, 2.3f), transform.position.y, transform.position.z); Instantiate(prefabTarget, TargetPosition, transform.rotation); } }
当たり判定の作成
次に、機体から発射した弾がマト(敵)に当たった時の判定(衝突判定)を作成していきます。まずは「コライダー」を追加。「Bulletプレハブ」に2Dサークルコライダーを追加し、トリガーにするにチェック。

同じように「Targetプレハブ」にも2Dカプセルコライダーを追加し、トリガーにチェック。コライダーは簡単に言うと物理範囲指定みたいな感じですかね。いい感じになるようにサイズなどを指定します。

次にTargetプレハブの方に2Dリジットボディも追加します。リジッドボディは簡単に言うと物理制御みたいな感じですね。基本的に「コライダー」と「リジッドボディ」はセットと考えても良いかと。今回はマトの方につけていきます。

Targetスクリプトを下記のように変更。トリガーにチェックを入れたので、弾とマトが衝突した時にOnTriggerEnter2Dが呼ばれます。その中でオブジェクトを消しています。
パラメータのcollisionには衝突した相手(この場合は弾)が入ってくるので、一緒に消しておきます。弾が貫通型の場合は「Destroy(collision.gameObject)」の部分は不要ですね。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Target : MonoBehaviour { void Update() { transform.position -= new Vector3(0, 1.5f * Time.deltaTime, 0); } private void OnTriggerEnter2D(Collider2D collision) { Destroy(gameObject); Destroy(collision.gameObject); } }
ついでにPlayerにも同じように2Dボックスコライダーを付けておきます。

試しに動かしてみてます。ランダム位置でマトが生成されて、弾が当たれば消滅すればOKです。Destroy(collision.gameObject)を付けている場合は、プレイヤーにマト(敵)が当たった時、プレイヤーが消えればOKです。