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

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

マトが動くようにする
マトが「上から出てきて下に落ちていく」ようにします。Scriptsフォルダ内で右クリック。Createから「C#Script」を選択し、Targetと言う名前でファイルを作成します。

Tartgetスクリプトの中身は下記のように変更します。下に場所を移動しているだけです。
using UnityEngine; public class Target : MonoBehaviour { private float speed = 1.5f; private void FixedUpdate() { transform.position -= new Vector3(0, speed, 0) * Time.fixedDeltaTime; } }
このスクリプトをTargetに追加します。

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

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

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

TargetCreateのスクリプトの中身は下記のように変更します。
using UnityEngine; public class TargetCreate : MonoBehaviour { [SerializeField] private GameObject prefabTarget; void Start() { Instantiate(prefabTarget, transform.position, Quaternion.identity); } }
TargetCreateスクリプトをTargetPointに追加して、変数には「Targetプレハブ」を指定します。

実行してみて、上からマトが出ればOKです。
マトを複数生成し生成位置をランダムにする
現状では、マトが真ん中から一回出るだけなので調整していきます。
まずは出てくる位置をランダムに変更します。下記のようにTargetCreateスクリプトを変更して、出現位置の横軸をランダムにしていきます。
using UnityEngine; public class TargetCreate : MonoBehaviour { [SerializeField] private GameObject prefabTarget; void Start() { Vector3 TargetPosition = transform.position; TargetPosition.x = Random.Range(-2.3f, 2.3f); Instantiate(prefabTarget, TargetPosition, Quaternion.identity); } }
スクリプトリファレンスの使い方とほぼ同じ感じですね。
次に、マトが複数出るようにします。色々な方法がありますが、とりあえず一定周期で無限に出るようにしています。ここは「マトをどうしたいか」で結構変わる気がします。
using UnityEngine; public class TargetCreate : MonoBehaviour { [SerializeField] private GameObject prefabTarget; private float Interval = 2.0f; private float time = 0; private void Update() { time += Time.deltaTime; if (time >= Interval) { RandomTargetCreate(); time = 0; } } private void RandomTargetCreate() { Vector3 TargetPosition = transform.position; TargetPosition.x = Random.Range(-2.3f, 2.3f); Instantiate(prefabTarget, TargetPosition, Quaternion.identity); } }
実行してみて下記のように動けばOKです。

当たり判定の作成
機体から発射した弾がマト(敵)に当たった時の判定(衝突判定)を作成していきます。TagsにBulletとTargetを追加します。

Bulletプレハブに「CircleCollider2D」を追加し、isTriggerにチェックします。TagをBulletにしておきます。

Targetプレハブに「Rigidbody2D」と「CapsuleCollider2D」を追加します。TagをTargetにしておきます。

Colliderは簡単に言うと衝突設定みたいな感じで、リジッドボディは簡単に言うと物理制御みたいな感じですね。
ついでにPlayerにも同じようにBoxCollider2Dを追加しておきます。

スクリプトを変更
Targetスクリプトを下記のように変更します。isTriggerにチェックを入れたので、弾とマトが衝突した時にOnTriggerEnter2Dが呼ばれます。その中でオブジェクトを消しています。
using UnityEngine; public class Target : MonoBehaviour { private float speed = 1.5f; private void FixedUpdate() { transform.position -= new Vector3(0, speed, 0) * Time.fixedDeltaTime; } private void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Bullet")) { Destroy(gameObject); } else if (collision.CompareTag("Player")) { Destroy(collision.gameObject); } } }
パラメータのcollisionには衝突した相手(この場合は弾かプレイヤー)が入ってきます。
試しに動かしてみてます。下記のように弾がマトに当たった時に消滅すればOKです。
