【Unity】2Dシューティングを作ってみる話 #9

記事をご覧いただき、誠にありがとうございます。
投稿主の無能です。

前回はプレイヤーと弾に画像を設定しました。

今回はいよいよ、敵を作っていきたいと思います。

敵のオブジェクトを作成する

まずプレイヤーを作成した時と同じように、仮のオブジェクトを敵とみなして作っていきましょう。

三角形を作成してEnemyとします。

無能はこんな感じに作りました。

仮の敵オブジェクトを作成

そしてこの敵オブジェクトにRigidbody2DとPolygonCollider2Dをアタッチします。

Player同様にRigidbody2DのGravity Scaleを0、Colliderのis Triggerにチェックします。

Rigidbody2DとPolygonCollider2Dをアタッチする

そしてEnemyタグを作成して付けます。

Enemyタグを作成して付ける

ここまでは色とタグが違うだけなので、今までPlayerにしてきたこととほぼ変わりませんね。

スクリプトもPlayerのものを流用できる部分は流用します。

EnemyControllerスクリプトを作成して敵オブジェクトへアタッチします。

EnemyControllerスクリプトを作成して敵オブジェクトへアタッチ

まずは敵が動くようにします。

このようになりました。
EnemyCotroller.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class EnemyController : MonoBehaviour
{
    [Header("敵の移動スピード")][SerializeField] float moveSpeed = 1f;

    Rigidbody2D enemyRB;        // 敵のリジッドボディ


    void Start()
    {
        // 敵のリジッドボディを取得
        enemyRB = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        // 敵を動かす
        EnemyMove();
    }

    void EnemyMove()
    {
        // 敵に左方向のベクトルを持たせる
        enemyRB.velocity = new Vector2(-moveSpeed, 0);
    }
}
敵を一定方向に動かすだけなら簡単ですね。

ではゲームを実行して確認します。

ゲームの実行画面

敵が左方向に、即ちPlayerが居る方向に向かって進んでいるのが分かります。

でも、PlayerとぶつかったりPlayerBulletとぶつかった時の処理のコードを書いていないので、そのまま素通りするだけです。

ObjectDestroyerに接触しても同じになります。

ですので各オブジェクトに接触したら、何らかの反応がされないと困ります。

という事で、ここではまずObjectDestroyerに接触した時、Playerに接触した時、PlayerBulletに接触した時に消えるような処理を書いていきます。

このようになります。

EnemyCotroller.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class EnemyController : MonoBehaviour
{
    [Header("敵の移動スピード")][SerializeField] float moveSpeed = 1f;

    Rigidbody2D enemyRB;        // 敵のリジッドボディ


    void Start()
    {
        // 敵のリジッドボディを取得
        enemyRB = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        // 敵を動かす
        EnemyMove();
    }

    // 敵を動かす
    void EnemyMove()
    {
        // 敵に左方向のベクトルを持たせる
        enemyRB.velocity = new Vector2(-moveSpeed, 0);
    }

    // 接触判定
    void OnTriggerEnter2D(Collider2D collision)
    {
        // プレイヤーに接触した場合
        if (collision.gameObject.CompareTag("Player"))
        {
            // 接触した方(プレイヤー)を破棄
            Destroy(collision.gameObject);
            // 自身を破棄
            Destroy(gameObject);
        }
        // プレイヤーの弾に接触した場合
        else if (collision.gameObject.CompareTag("PlayerBullet"))
        {
            // 接触した方(プレイヤー)を破棄
            Destroy(collision.gameObject);
            // 自身を破棄
            Destroy(gameObject);
        }
        // ObjectDestroyerに接触した場合
        else if (collision.gameObject.CompareTag("ObjectDestroyer"))
        {
            // 自身を破棄
            Destroy(gameObject);
        }
    }
}
そしてタグで判別できるように、ObjectDestroyer・PlayerBulletにタグを付けていきます。

四方のObjectDestroyerにはそれぞれObjectDestroyerタグを、PlayerBulletにはPlayerBulletタグを付けます。

四方にObjectDestroyerタグを付けた

弾にPlayerBulletタグを付けた

それではゲームを実行して、Player・PlayerBullet・ObjectDestroyerの3つそれぞれの接触した時の挙動を確認します。

Playerに接触

PlayerBulletに接触

ObjectDestroyerに接触

敵がそれぞれに接触したら消えるようになりました。

ObjectDestroyerに接触した時だけ、自身だけを破棄しているのは、ObjectDestroyerが消えてしまうとその後の後続の敵を消すためのオブジェクトが破棄されてしまうからです。

取り敢えずは敵オブジェクトを作成し、接触判定を持たせることができました。

まとめ

今回は
  • 敵オブジェクトを作成し、Playerの方向に向けて動かした
  • 敵オブジェクトとの接触判定を作った
という事をやりました。

次回は、敵が自動で出てくような仕組みを作りたいと思います。

では、また次回!

コメント