【Unity】2Dシューティングを作る ~敵に弾を撃たせる~

unityで敵に弾を撃たせる unity

プレイするゲームがないなら、自分で作ればいいじゃない!

ということで Unity 初心者が「ゲームを作る」ゲームをやっていきます!

今回は「敵に弾を撃たせる」の記事です

 

スポンサーリンク

内容

「自機狙い」「前方3方向(3WAY)」の弾を敵に撃たせる

 

弾の準備

まずは画像の用意

シーンに配置して、コライダーとスクリプトを追加します

 

弾のスクリプト

方向ベクトルに移動値をかけて加算するシンプルなもの

public class EnemyBullet : MonoBehaviour
{
    [SerializeField] float moveSpeed = 3.0f;                   // 移動値
    [SerializeField] Vector3 moveVec = new Vector3(-1, 0, 0);  // 移動方向
    
    void Update()
    {
        float add_move = moveSpeed * Time.deltaTime;
        transform.Translate(moveVec * add_move);
    }

    public void SetMoveSpeed(float _speed)
    {
        moveSpeed = _speed;
    }

    public void SetMoveVec(Vector3 _vec)
    {
        moveVec = _vec.normalized;
    }
}

Vector3.normalized

正規化されたベクトルを返す

正規化:方向は同じで長さが1のもの

 

最後にプレハブにします

 

敵に撃たせる

敵のスクリプトにショット情報を追加

enum ShotType
{
    NONE = 0,
    AIM,            // プレイヤーを狙う
    THREE_WAY,      // 3方向
}

[System.Serializable]
struct ShotData
{
    public int frame;
    public ShotType type;
    public EnemyBullet bullet;
}

// ショットデータ
[SerializeField] ShotData shotData = new ShotData { frame = 60, type = ShotType.NONE, bullet = null };

GameObject playerObj = null;    // プレイヤーオブジェクト
int shotFrame = 0;              // フレーム

void Start()
{
    // プレイヤーオブジェクトを取得する
    switch (shotData.type)
    {
        case ShotType.AIM:
            playerObj = GameObject.Find("player");
            break;
    }
}

// ショット処理(これをUpdateなどで呼ぶ)
void Shot()
{
    ++shotFrame;
    if (shotFrame > shotData.frame)
    {
        switch (shotData.type)
        {
            // プレイヤーを狙う
            case ShotType.AIM:
            {
                if (playerObj == null) { break; }
                EnemyBullet bullet = (EnemyBullet)Instantiate(
                    shotData.bullet,
                    transform.position,
                    Quaternion.identity
                );
                bullet.SetMoveVec(playerObj.transform.position - transform.position);
            }
            break;

            // 3方向
            case ShotType.THREE_WAY:
            {
                EnemyBullet bullet = (EnemyBullet)Instantiate(
                    shotData.bullet,
                    transform.position,
                    Quaternion.identity
                );
                bullet = (EnemyBullet)Instantiate(shotData.bullet, transform.position, Quaternion.identity);
                bullet.SetMoveVec(Quaternion.AngleAxis(15, new Vector3(0, 0, 1)) * new Vector3(-1, 0, 0));
                bullet = (EnemyBullet)Instantiate(shotData.bullet, transform.position, Quaternion.identity);
                bullet.SetMoveVec(Quaternion.AngleAxis(-15, new Vector3(0, 0, 1)) * new Vector3(-1, 0, 0));
            }
            break;
        }

        shotFrame = 0;
    }
}
GameObject.Find(string name);

name と 一致する GameObject を検索して返す

アクティブなゲームオブジェクトのみ検索する

処理が重いため、Update 処理では呼ばない方が良い

 

Quaternion.AngleAxis(float angle, Vector3 axis)

axis を軸として angle 度回転するクォータニオンを作成する

今回はZ軸で15度回転するクォータニオンを作って、Vector3(-1, 0, 0) を回転させています

2Dゲームですが、回転の処理はzも使用します

Z軸の回転
Z軸での回転
Z軸の回転後
回転後のイメージ図

 

敵オブジェクトの情報を設定する

あとは弾を撃たせたい敵の ShotData を設定するだけ!

敵のショット情報を設定する

 

サンプル動画

 

さいごに

敵が攻撃してくると画面が賑やかになりますね!

 

かれいど

ゲームをしたり、作ったり
色々な事に挑戦していきたい!

サッカー観戦も趣味で
主にJ1リーグを観ています。

かれいどをフォローする
unity
スポンサーリンク
シェアする
かれいどブログ

コメント

  1. やすす より:

    敵が弾を撃ってくれませんどうすればいいですか

    • かれいど かれいど より:

      詳細が分からないので、何とも言えないですが、プレイヤー狙いの弾だった場合 playerObj が null だと弾が作成されない状態になります。
      なので、playerObj = GameObject.Find(“player”);でnullになっているかもです。
      “player”部分は狙いたいオブジェクトの名前になるので、適宜修正が必要になります。