Unity|簡単な縦型の2Dシューティング作成(スマホ)。Part4.敵のマト生成と当たり判定

簡単な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です。

タイトルとURLをコピーしました