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

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

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