このブログはUnityの初心者向けに、Untiyの機能の使い方、基本のスクリプトファイルの使い方から応用までをご説明しています。中級以上の方に読んでいただきたい内容も随時更新していますので、お時間がある方、検索でここにアクセスされた方はぜひ立ち寄っていってください。
一分間Unity講座のまとめはこちらから。
前回の記事では 「Coroutine(コルーチン)」を使用して、連続して弾を発射する動きを作成しました。今回はその応用で、4方向に弾を発射し続ける動きを作成してみます。
下の動画は「ファイブボックス 一分間Unity講座 回転しながら4方向に弾幕を発射し続ける方法」 のショート動画です。ご興味がございましたら、こちらの動画もご参照ください。
前回までのプログラム
今回は前回作成したコルーチンを使った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しておきます。
回転しながら4方向に弾を発射
複数の方向に弾を発射するには for()文 を使います。
作成済みの ShotCoroutine()
を以下の3か所を修正します。
- くり返し無限ループの内部で、
for()文
を使って1ターンで4発のBulletを生成 - 生成する弾の向き
Instantiate()
関数の3つ目の引数は生成するオブジェクトの向きです。Quaternion.Euler()
メソッドを使って、Z軸を現在の向きにループ変数:i*90 度を足した角度に指定。4つの Bullet は90度ずつ変化した状態で生成されます - 発射する弾の方向 もともと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秒後に削除
}
}
}
これで下の図のように、上下左右に弾が飛ぶようになります。
さらに発射するプレイヤーを回すことで、簡単な弾幕を作ることができます。
デバイス間の動きに違いが発生しないように FixedUpdate()
関数を使用します。
void FixedUpdate()
{
transform.Rotate(0, 0, 2.0f); //2度ずつ回転
}
弾は直線状に移動しますが、Playerを回転させることで単純な動きの弾幕ができました。
振り子運動をしながら4方向に弾を発射
続いて振り子運動をしながら上方向に弾幕を発射する動きです。
「ファイブボックス 一分間Unity講座 振り子運動をしながら弾幕を撃ち続ける方法」 でイメージをご確認ください。
まずは前方に4発の弾を生成する仕組みを作ります。4つの弾はそれぞれ -30度、-10度、10度、30度と20度ずつずれて発射されます。
この動きを作るには -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自身を左右に回転させることで、前方向に弾をまき散らすことができます。
左右に振り子運動をさせるには、三角関数を使用します。
void FixedUpdate()
{
transform.Rotate(0, 0, Mathf.Cos(Time.time * 2.0f) * 1.5f);
}
これでYoutubeのショート動画のようにきれいに弾を発射する動きができたと思います。
ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。