衝突判定をする
敵が出現したのはいいのですが、いくら弾を当てても素通りしてしまいます。これではゲームになりません。敵に弾が当たったら消えるようにしましょう。
敵に衝突判定を付ける
まず、Enemyにコライダを付けます。コライダというのは他のコライダと接触したり重なったりした場合に検知してくれるセンサの働きをしてくれるコンポーネントです。Enemyのプレハブを選択した状態で、メニューから → → を選びます。同じようにBulletのプレハブにもコライダを取り付けます。こちらはメニューから → → を選びます。
次に、スクリプトにメソッドを追加します。
void OnTriggerEnter2D(Collider2D collision)
{
Destroy(gameObject);
}
OnTriggerEnter2Dは、ゲームオブジェクトに付いているコライダが何かに反応したら呼ばれる(実行される)メソッドです。引数のCollider2D型の変数には、反応したコライダ(ぶつかってきた相手)の情報が入ってきます。ぶつかってきた相手を知りたい場合に使います。
今回は、何かに当たったら自分を消すという処理を入れました。これで、弾が当たったら敵が消えるはずです。実行してみましょう。

敵に当たった弾が弾かれて方向がそれていきました。コライダの設定が間違っていたようです。2Dコライダの
の設定にチェックを入れ忘れていました。
EnemyとBulletどちらのコライダもトリガーにしておきます。トリガーというのは、衝突したときに物理的な影響は与えないけれど、衝突したことは検知できるようにする仕組みのことです。チェックを入れないと物理的に影響を与えるため、さっきのように衝突したときに弾かれたりします。今度はどうでしょうか。


無事に消えてくれました。ただ、敵を消した後も、弾が貫通して飛び続けているのが気になります。敵に当たったら、弾も消えるようにしましょう。EnemyにつけたメソッドをBulletにも加えます。
画面から消えた敵を消す
弾に当たって消えた敵はいいんですが、撃ち漏らした敵は画面下に消えても永遠に下に移動し続けます。これも、弾と同じく画面から見えなくなったタイミングで消えてもらいましょう。Updateメソッドに以下の処理を書き加えます。
void Update()
{
if (transform.position.y < -6)
{
Destroy(gameObject);
}
}
ここまでのコードを確認します。
using UnityEngine;
public class Enemy : MonoBehaviour
{
//このクラスの変数など
Rigidbody2D rb;
const float speed = 1f;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
rb = GetComponent<Rigidbody2D>();
rb.linearVelocity = transform.up * speed;
}
// Update is called once per frame
void Update()
{
if (transform.position.y < -6)
{
Destroy(gameObject);
}
}
void OnTriggerEnter2D(Collider2D collision)
{
Destroy(gameObject);
}
}
using UnityEngine;
public class Bullet : MonoBehaviour
{
//このクラスの変数など
Rigidbody2D rb;
const float speed = 20f;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
rb = GetComponent<Rigidbody2D>();
rb.linearVelocity = Vector2.up * speed;
}
// Update is called once per frame
void Update()
{
if (transform.position.y > 6)
{
Destroy(gameObject);
}
}
void OnTriggerEnter2D(Collider2D collision)
{
Destroy(gameObject);
}
}
今回はここまでです。お疲れ様でした。
コメント