top of page

ファイブボックス 一分間Unity講座 振り子運動をしながら複数の弾幕を撃ち続ける方法

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


前回の記事では 「Coroutine(コルーチン)」を使用して回転しながら4方向に弾を生成する動きを作ってみました。 今回は三角関数を使って振り子運動をしながら、前方に4発の弾を撃ち続ける方法についてご説明します。


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



1 前回までのプログラム


前回は以下のコードで弾幕を前後左右4方向に生成し、Player自身を回転させることで全方向に向け弾幕を発射させました。

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

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

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

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秒後に削除
        }
    }
}  

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

なおBulletのプレハブにはRigidbody2D コンポーネントがついているだけで、スクリプトファイルは与えていません。


2 前方への弾幕生成


まずは前方に4発の弾を生成する仕組みを作ります。4つの弾はそれぞれ -30度、-10度、10度、30度と20度ずつずれて発射されます。

20度ずつずれて4発発射

この動きを作るには -30度を起点に20度ずつずらし、for文を使って4発の弾を生成します。

作成済みのコルーチンを以下のように修正します。

IEnumerator ShotCoroutine()
{
    while (true)    //無限ループ
    {
        yield return new WaitForSeconds(0.2f);      //0.2秒待機
        for(int i = 0; i < 4; i++)                  //4回繰り返す
        {
		    //PlayerのZ軸の向きに対し-30度を起点に20度ずつ更新
		    float d = transform.eulerAngles.z + (-30 + i * 20);
			//弾のプレハブを生成し、向きのZ軸に取得した変数:d を指定
             GameObject bullet =
                Instantiate(bulletPrefab, transform.position, 
                Quaternion.Euler(0,0,d));
            //bulletからRigidbodyコンポーネントを取得、弾の上向きの力を加える
            bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.up * 200);
            Destroy(bullet, 2.0f);      //bullet を2秒後に削除
        }
    }
}  

続いてPlayer自身を左右に回転させることで、前方向に弾をまき散らすことができます。

左右に振り子運動をさせるには、三角関数を使用します。

三角関数でPlayerを回転
void FixedUpdate()
{
    transform.Rotate(0, 0, Mathf.Cos(Time.time * 2.0f) * 1.5f); 
}

これでYoutubeのショート動画のようにきれいに弾を発射する動きができたと思います。


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

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

Commenti


bottom of page