norablog-techのブログ

このブログは、自分の忘備録的にアウトプットするためのブログとなっております。

【Unity】敵機と弾の衝突判定を行い、敵機を消滅させる。

変更:
2022/01/25 変数名を"アッパーキャメル"から、すべて小文字に修正。

 

今回は、敵機と弾の衝突判定を行い、敵機を消滅させます。


www.youtube.com

 

前回、前々回、"Rigidbody"と"Collider"を使って、"Boundary"外に出たGameObjectを消滅させました。
同じやり方で衝突判定をして、敵機と当たった弾の両方を消そうと試みたのですが、どうもうまくいきません、
BulletPreFabController.cs(弾)やCirclePerFabController.cs(敵機)にDestroyを記述しても、敵機と弾を消滅させることができても、"Boundary"外に出た敵機が消えなくなったり、初めにスペースキーを押したら、一度ゲーム画面上の敵機と弾が消えてしまったりと思うような動きをしてくれませんでした。

GameObjectとしか指定できていないので、対象の判別があいまいになりきちんと動かないのではと推測しました。

色々調べるなかで、"Tag"を使う方法に行き当たりました。

 

今回はその"Tag"を各GameObjectを識別し、確実の対象を操作できるようにしてみます。

1.各GameObjectに"Tag"を設定する。
 これは各インスペクターに項目があります。
 "Player"など、いくつかすでに用意されているTagもありますが、用意されていないものは追加します。

 

2.敵機(CirclePreFab)のトリガーにチェックを入れます。

 

3.CirclePerFabController.cs(敵機)にTag識別による分岐でDestroyを記述します。

 ※OnTriggerExit2D と似た OnTriggerEnter2D(触ったら発動)を使います。

 //追記
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Bullet"))  //Tagが"Bullet"だったら
        {
            Destroy(collision.gameObject);  //ぶつかったもの(Bullet)
            Destroy(gameObject);            //gameObject:自分(Circle)自身
        }
    }

 

CirclePreFabController,cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CirclePreFabController : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.position += new Vector3(
                0f,
                -0.5f * Time.deltaTime,
                0f
            );
    }

 

    //追記
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Bullet"))  //Tagが"Bullet"だったら
        {
            Destroy(collision.gameObject);  //ぶつかったもの(Bullet)
            Destroy(gameObject);            //gameObject:自分(Circle)自身
        }
    }

}

 

前回から変更

GameController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameController : MonoBehaviour
{
    //追加
    //敵機をGameObjectとして宣言する
    public GameObject circleprefab;  //変更

    // Start is called before the first frame update
    void Start()
    {
        //追加
        //GenerateCircle()を開始する
        StartCoroutine("GenerateCircle");
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    //追加
    //敵機(Circle)を生成する
    IEnumerator GenerateCircle()
    {
        while (true)
        {
            Instantiate(
                circleprefab,  //変更
                //X軸方向はランダム、Y軸方向6.0f、Z軸方向0.0fに敵機を生成
                new Vector3(Random.Range(-8.5f, 8.5f), 6.0f, 0.0f),
                transform.rotation
            );
            //1秒ごとに実行する。
            //yield return new WaitForSeconds(1.0f);
            //変更
            yield return new WaitForSeconds(Random.value * 2.0f);
        }
    }

}

今回は以上となります。