【Unity】2Dシューティングゲームの作り方⑤:敵にダメージを与える

Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、Unityを使った2Dシューティングゲームの作り方5回目として、敵にダメージを与える処理について紹介しています。

前回、プレイヤーから弾を発射させることができるようになりました。

今度は、その発射した弾が敵に当たった際に、敵のHPを減らして0になったら消去するという処理を作っていきます。

オブジェクト同士が当たったことを判定するためには、当たり判定を作ってその中で処理を書いていく必要があります。

そこで、プレイヤーの弾と敵のオブジェクトに当たり判定を作り、敵のHPを減らして倒す処理までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

弾にColliderコンポーネントを付ける

まずは、前回Prefab化した弾のオブジェクトに対して、Collider(コライダー)コンポーネントを付けていきます。

Colliderコンポーネントとは、オブジェクトの当たり判定を決める範囲を定義する役割のあるコンポーネントです。

Unityで当たり判定を作る際は、衝突する両方のオブジェクトに対して、Colliderコンポーネントが必要になります。

このColliderコンポーネントの付け方は、Prefab化した弾のオブジェクトを選択して、インスペクターウィンドウの「Add Component」をクリックします。

次に、「Physics 2D」から円形のコライダーである「Circle Collider 2D」を選択します。

今回は、Prefab化したオブジェクトにコライダーの範囲を設定していくので、インスペクターウィンドウの一番上の「Open」を押してオブジェクトを開きます。

そして、操作ツールのCollider編集のボタンを選択すると、オブジェクトの周りに緑の範囲が出てきて、この範囲が当たり判定の箇所になるので、弾のオブジェクトに合った形のコライダーになるように、マウス等で編集していきます。

コライダーの範囲を設定できたら、次にインスペクターウィンドウの「Is Trigger」という項目にチェックを入れておきます。

この「Is Trigger」は、オブジェクトが衝突した際にすり抜けるというTriggerモードと呼ばれる設定になっていて、今回は当たり判定を取得できるだけで良いので、このTriggerモードにしておきます。

これで、弾のオブジェクトにColliderコンポーネントを付けることができました。

弾にRigidbodyコンポーネントを付ける

先ほどの弾のオブジェクトに、今度はRigidbody(リジッドボディ)コンポーネントを付けていきます。

このRigidbodyコンポーネントとは、オブジェクトに重力や摩擦などの物理的挙動を付けるためのコンポーネントです。

当たり判定を作る際は、どちらか片方のオブジェクトに、このRigidbodyコンポーネントを付けておく必要があります。

Rigidbodyコンポーネントの付け方は、Prefab化した弾のオブジェクトを選択して、インスペクターウィンドウの「Add Component」をクリックします。

次に、「Physics 2D」から「Rigidbody 2D」を選択します。

これでRigidbodyコンポーネントが付きますが、デフォルトで重力機能が付いているため、そのままだと弾は発射しても下に落ちてしまいます。

そのため、この重力機能を止めるために、Rigidbodyコンポーネントの項目のBody Type「Kinematic」に変更しておきましょう。

これで、弾のオブジェクト側の当たり判定の設定が完了しました。

敵にColliderコンポーネントを付ける

次は、当たる側のオブジェクトである敵に対してColliderコンポーネントを付けていきます。

付け方は先ほどと同じで、敵のオブジェクトを選択して、インスペクターウィンドウの「Add Component」をクリックします。

「Physics 2D」から多角形のコライダーである「Polygon Collider 2D」を選択します。

シーンビューの操作ツールから、Colliderの編集ボタンを選択して、オブジェクトに合わせて当たり判定を設定します。

Polygon Collider 2Dは、頂点を複数設定することができるコライダーになっているので、オブジェクトに合わせて頂点をマウスで作成して、以下のように範囲を設定してみました。

そして弾のオブジェクトと同じく、Colliderコンポーネントの設定項目にある「Is Trigger」にチェックを入れて、オブジェクトをすり抜けるようにしておきます。

これで、敵オブジェクトのColliderコンポーネントの設定が完了しました。

敵にタグの設定を行う

当たり判定の処理を作る前に、敵オブジェクトに対してタグの設定を行っておきましょう。

タグとは、そのオブジェクトがどういうオブジェクトなのかを判別するための機能で、タグ単位で処理を制御することができます。

簡単に言えば、敵オブジェクトにであるというタグを付けて、プレイヤーの弾と敵のタグが付いたオブジェクトが当たった際の処理を作っていくために設定します。

まず、敵のオブジェクトを選択して、Tagの部分を選択します。

リストの中から、「Add Tag…」を選択します。

Tagsの「+」ボタンを押して、敵を表す「Enemy」というタグ名を入力してSaveを選択します。

もう一度、敵のオブジェクトのインスペクターウィンドウのTagから、「Enemy」を選択します。

これで、敵オブジェクトにEnemyというタグを付けることができました。

今後、敵を追加して配置する際は、このEnemyというタグを付けておけば、当たり判定の処理を敵ごとに書いていく必要がなくなります。

敵に当たったら弾の表示を消す

弾と敵に当たり判定の設定が完了しましたが、現状ではゲームを実行してもただ弾が敵をすり抜けてしまうだけです。

ここから、実際に当たり判定が起きた際の処理をスクリプトで書いていきます。

まずは、プレイヤーの弾が敵に当たった際に、弾の表示を消すという処理を加えていきます。

プレイヤーの弾にアタッチしているPlayerBulletMoveのスクリプトファイルに、以下の16~22行目のスクリプトを加えていきます。

using UnityEngine;

public class PlayerBulletMove : MonoBehaviour
{
    float bulletSpeed = 0.2f;   // 弾のスピードを決める変数

    void Update()
    {
        transform.Translate(0, bulletSpeed, 0); // Y座標をプラスに動く
        if (transform.position.y > 5)   // Y座標が5より大きい場合
        {
            Destroy(gameObject);    // オブジェクトを破壊する
        }
    }

    void OnTriggerEnter2D(Collider2D collision) // 当たり判定のあるオブジェクトと当たった場合
    {
        if (collision.gameObject.tag == "Enemy")    // 当たったオブジェクトがEnemyの場合
        {
            Destroy(gameObject);    // オブジェクトを破壊する
        }
    }
}

16行目でOnTriggerEnter2Dメソッド内に、オブジェクトと当たった場合の処理を書いていきます。

OnTriggerEnter2Dとは、オブジェクト同士が当たった瞬間に呼び出されるメソッドで、このメソッドの中で弾の表示を消す処理を書いていきます。

引数には、当たった相手のオブジェクト(今回は敵)のColliderコンポーネントが渡される仕様となっているため、Collider2D型の変数としてcollisionを設定しています。

18行目で敵に設定したタグの「Enemy」を使って、if文で当たったオブジェクトの指定をしています。

タグ名を取得する際は、gameObject.tagと書いてあげることで、そのオブジェクトに付いているタグ名を取得することができます。

そして、20行目でオブジェクトが敵だった場合の処理としてDestroyメソッドで弾を破壊して、消去させています。

実際に、ゲームを実行してみると、

弾が敵に当たると、弾が破壊されて消えていて、弾が当たったという感じがしますね。

なお、前回プレイヤーの弾のスクリプト作成の際に紹介したDestroyメソッドや、変数・if文などについては、以下の記事で詳しく解説していますので、参考にしてみてください。

敵にHPを作って0になったら消去する

弾のオブジェクトを消す処理が出来たので、次に敵にダメージを与える処理を書いていきます。

ここでは、敵に体力としてHPを持たせて、プレイヤーの弾が当たるとHPが減り、0になったら敵を消去するというスクリプトを作っていきます。

まだこのゲームでは、敵のスクリプトを作っていなかったので、スクリプトの作成から行っていきます。

なお、今後敵を増やしていくことも考えて、「Enemy01」という名前でスクリプトを作成しています。

using UnityEngine;

public class Enemy01 : MonoBehaviour
{
    int hp = 1; // HPを管理する変数を宣言

    void OnTriggerEnter2D(Collider2D collision) // 当たり判定のあるオブジェクトと当たった場合
    {
        if (collision.gameObject.name == "PlayerBullet")   // 当たったオブジェクトがプレイヤーの弾の場合
        {
            hp--;   // HPを1減らす処理

            if (hp <= 0)    // HPが0になった場合
            {
                this.gameObject.SetActive(false);    // 敵オブジェクトを非表示にする
            }
        }
    }
}

5行目でHPを管理する変数hpを作成して、初期値として1を設定しています。

そして、7行目でOnTriggerEnter2Dメソッドを使って、弾のオブジェクトに当たった際の処理を書いていきます。

プレイヤーの弾に当たった際にHPを減らしたいので、当たったオブジェクト名が「PlayerBullet」であるかどうかを9行目でif文でチェックしています。

プレイヤーの弾が一回当たるとHPを1減らすという処理にしたいので、

hp--;

と書いてあげることで、HPが1ずつ減っていきます。

13行目でHPが0以下になった際に、敵オブジェクトを消去するという処理をif文を使って書いています。

これまでは、オブジェクトを消す場合はDestroy関数を使っていたのですが、今回はSetActive関数というものを使っています。

SetActive関数は、オブジェクトを表示したり非表示にしたりする処理を行うメソッドで、

this.gameObject.SetActive(false);

と、書いてあげることで自分自身のオブジェクトを非表示にすることができます。

オブジェクトが完全に消去されるわけではありませんが、表示させないことで同じようにゲーム画面から消すという処理を行うことができます。

なお、Destroy関数は負荷のある処理であるのに対して、SetActive関数は負荷が少ないので、このように画面から消去される場合などによく使われる方法です。

これで実際に、ゲームを実行して敵に弾を当ててみます。

最初の敵はHPを1にしているので、一回当てるだけで消えてしまいますが、敵を倒すという処理を書くことができました。

まとめ

このページでは、敵に当たり判定を付けてダメージを与えるという処理を作っていきました。

オブジェクトに対して当たり判定を付ける場合は、

の2つが必要になってきます。

そして、実際にオブジェクト同士が当たった時に呼び出されるOnTriggerメソッドを使うことで、当たった際の処理を作っていくことができます。

次は、反対に敵の動きを作って、敵から弾を発射させる処理を作っていきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント