top of page

ファイブボックス 一分間Unity講座 コルーチンを使って回転しながら4方向に弾幕を撃ち続ける方法

このブログはUnityの初心者向けに、Untiyの機能の使い方、基本のスクリプトファイルの使い方から応用までをご説明しています。中級以上の方に読んでいただきたい内容も随時更新していますので、お時間がある方、検索でここにアクセスされた方はぜひ立ち寄っていってください。


前回の記事では 「Coroutine(コルーチン)」を使用して繰り返し弾を撃ち続ける動きを作成しました。今回はこのコルーチンを応用し、4方向に弾を生成、さらに発射するオブジェクトを回転させることにより弾幕の生成を実現してみます。


下の動画は「ファイブボックス 一分間Unity講座 回転しながら4方向に弾幕を発射し続ける方法」 のショート動画です。ご興味がございましたら、こちらの動画もご参照ください。




1 前回までのプログラム


今回は前回作成したコルーチンを使った0.2秒ごとに弾を発射するプログラムを修正します。前回作成したコードは以下のものです。


[SerializeField] GameObject bulletPrefab;   //Bulletのプレハブ

void Start()
{
    StartCoroutine(ShotCoroutine());    //ShotCoroutineを呼び出す
}

IEnumerator ShotCoroutine()
{
    while (true)    //無限ループ
    {
        yield return new WaitForSeconds(0.2f);      //0.2秒待機
        //Playeの場所に弾を生成し bullet という名前で変数化
        GameObject bullet =
            Instantiate(bulletPrefab, transform.position, Quaternion.identity);
        //bulletからRigidbodyコンポーネントを取得し、上向きの力を加える
        bullet.GetComponent<Rigidbody2D>().AddForce(transform.up *200);
        Destroy(bullet, 2.0f);      //bullet を2秒後に削除
    }
}

[SerializeField]を指定して変数で宣言した bulletPrefab にはInspectorからRigidbody2Dコンポーネントを付与した Bullet のプレハブをAssignしておきます。


変数BulletPrefabにBulletオブジェクトをAssign

2 4方向に弾を発射


複数の方向に弾を発射するには for()文 を使います。

作成済みの ShotCoroutine() を以下の3か所を修正します。

  1. くり返し

    無限ループの内部で、for()文を使って1ターンで4発のBulletを生成

  2. 生成する弾の向き

    Instantiate()関数の3つ目の引数は生成するオブジェクトの向きです。

    Quaternion.Euler()メソッドを使って、Z軸を現在の向きにループ変数:i*90 度を足した角度に指定。4つの Bullet は90度ずつ変化した状態で生成されます

  3. 発射する弾の方向 もともとPlayerの向きに対し上向きの力を加えていたものを、生成された Bullet の向きに対し上向きの力を加えます


IEnumerator ShotCoroutine()
{
    while (true)    //無限ループ
    {
        yield return new WaitForSeconds(0.2f);      //0.2秒待機
        for(int i = 0; i < 4; i++)                  //4回繰り返す
        {
            //Playeの場所に弾を生成し変数化、向きを90度ずつ変更
            GameObject bullet =
                Instantiate(bulletPrefab, transform.position, 
                Quaternion.Euler(0,0,transform.eulerAngles.z+i*90));
            //bulletからRigidbodyコンポーネントを取得、弾の上向きの力を加える
            bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.up * 200);
            Destroy(bullet, 2.0f);      //bullet を2秒後に削除
        }
    }
}  

これで下の図のように、上下左右に弾が飛ぶようになります。

弾を4方向に飛ばす

さらに発射するプレイヤーを回すことで、簡単な弾幕を作ることができます。

デバイス間の動きに違いが発生しないように FixedUpdate()関数を使用します。


void FixedUpdate()
{
    transform.Rotate(0, 0, 2.0f);   //2度ずつ回転
}

弾は直線状に移動しますが、Playerを回転させることで単純な動きの弾幕ができました。

Playerを回転することで弾幕を生成

弾やPlayerの動きに変化を与えることで、バリエーションにとんだ弾幕を作ることができます。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。

ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。


Comments


bottom of page