top of page

Unityで「シューティングゲーム」をつくろう!Vol.15

Unityで作る「シューティングゲーム」。前回は「敵2」の基本的な動きを作ってみました。今回は「敵2」の攻撃を作ってみます。この敵は「敵1」よりも単調な動きなので、たくさんのミサイルを撃ってくるという攻撃にします。ただし「敵1」の弾はちょっと見ずらいので、新たな弾も作っておきましょう。


では早速作っていきます。

 

1,敵2の弾の準備

まずは素材ですが、今回も取得済みのアセットから選びます。


①Particles のフォルダにある「Burst」なんかがいいんじゃないでしょうか?各自好きな画像を選択してみましょう。選択したら、「Hierarchy」にドラッグ&ドロップ。

②基本的な部分を作っていきます。「名前」を「Enemy2Bullet」にしておきます。


③Tagには作成済みの「Enemy」をセットします。


④敵の弾は下向きに飛んでいくので向きを変更します。

Transformコンポーネントの「Rotation」のZ軸を180にします。Z軸を中心に180度回転、つまり反対向きになるということですね。見た目の変化はほとんどありませんが、前に進む命令を受けたとき、下向きに飛びます。

なお、「Position」のX座標も変わっていますが、これは一時的にPlayerと重ならないようにしているだけです。


⑤「SpriteRendere」コンポーネントの「Color」を赤系統の色にします。この作品では敵の攻撃を赤系統中心に配色しています。


⑥同じく「SpriteRendere」コンポーネント「SortingLayer」に作成済みの「Enemy」をセットしておきます。

Unityで作るシューティングゲーム

続いてコンポーネントを追加します。


⑦まずは「Circle Collider 2D」コンポーネント。

⑧「Edit Collider」を押して、Collider の大きさ、位置を調整します。

さらに「Is Trigger」にチェックを入れて、侵入判定用にします。


⑨つづいて「Rigidbody 2D」コンポーネントをセット。

⑩ここでは「Gravity Scale」を 0 にして、重力の影響を受けない設定にします。

⑪最後は演出部分のコンポーネントを追加します。

「Trail Renderer」を選択して追加しましょう。「Trail Renderer」はオブジェクトが動くときに、その後ろにトレイル (軌跡) を演出したい時に使用します。

このコンポーネントのプロパティはとてもたくさんあり、ここではすべて紹介できませんので、詳しくは公式サイトでご確認ください!

サンプルでは「Time」「Color」などを変更し、以下のように指定しています。

続いて「Enemy2Bullet」の動きを管理するプログラムを作っていきます。「Enemy2Bullet.cs」というスクリプトファイルを作成し、以下のコードを記述します。


基本の動きは「敵1」の弾のスクリプトファイル「EnemyBullet.cs」と同じです。違いは弾を削除するタイミングです。「敵1」の攻撃はスピードが速く、消えるまでの時間に個体差はほぼなかったため「3秒後に消える」などのプログラムを追加しました。

今回は、敵自体が比較的遅いため、敵のY座標によって早く消える弾と、遅く消える弾が混在してしまいます。そこで、「画面から見えなくなったら消える」というプログラムを記述します。そのためには「SpriteRenderer」コンポーネントの「isVisible」というプロパティを使います。

「isVisible」はBool型のプロパティで、true なら見えている、false なら見えていない、ということになります。


❶では「SpriteRenderer」型の変数:「ebrenderer」を宣言しています。


❷で宣言した変数に「GetConponent関数」を使って、中身を取り出し代入しています。


❸の「! ebrenderer.isVisible」、見えているに「!」をつけることで「見えていない」ということになりますね?つまり「もし画面からみえなくなったら・・・」という意味になります。

 

public GameObject shoot_effect; //発射時ののエフェクト

public GameObject hit_effect; //当たった時のエフェクト

SpriteRenderer ebrenderer; //❶敵の弾のレンダラー


void Start()

{

ebrenderer =GetComponent<SpriteRenderer>(); //❷ebrenderer を取得

Instantiate(shoot_effect, transform.position, Quaternion.identity);

}


//侵入判定

void OnTriggerEnter2D(Collider2D col)

{

if (col.tag != "Enemy") //タグが Enemy で無かったら

{

Instantiate(hit_effect, transform.position, Quaternion.identity);

Destroy(gameObject);

}

}


void Update()

{

if(!ebrenderer.isVisible) //❸枠外に出たら

{

Destroy(gameObject); //消滅

}

}

 

これを「Enemy2Bullet」にアタッチしておきましょう。


⑫public 変数で指定した「Shoot_effect」「Hit_effect」には以下のプレファブを指定しておきます。


ここまで出来たら、「Enemy2Bullet」を「Project」にドラッグ&ドロップしてプレファブ化しておきます。

これで敵2の弾はいったん完成です。



 

2,敵2の攻撃

今回は今作った球を使って、敵2(Enemy2)が攻撃するところまで作ってしまいましょう。

「Enemy2Controller.cs」を立ち上げて以下のコードを追加します。


まず変数を3つ宣言します。

変数:「shot_speed」敵2の弾の速さ、Start関数の中の、❽で初期値300をセットしています。

変数:「shotDelayは弾を撃つ間隔、この値はコルーチンの中で毎回乱数で決定します。

❻には上で作成した「Enemy2Bullet」になります。後ほどInspectorからセットします。


❼つづいて攻撃のコルーチン型関数「Shot()」を作成します。

これは前回も説明しました。最初はわかりにくいですが使っているうちに、徐々に理解が深まっていくと思います。

まず

yield return new WaitForSeconds();

で指定した時間待ちます。これは登場シーンを想定しています。

その後「while(true) { }」で無限ループを作ります。

無限ループ内では❺で宣言した変数:「shotDelay」に0.5秒~1.5秒の値を指定し、まずはその時間だけ休憩。

GameObject Laser = Instantiate(EnemyBullet, transform.position, transform.rotation);

で弾(Laser)を生成します。生成した弾(Laser)の Rigidbody2D に

Laser.GetComponent<Rigidbody2D>().AddForce(EnemyBullet.transform.up * shot_speed);

前向き×shot_speed の速度を与えます。


❾このコルーチン型の関数はStart関数で起動します。

コルーチン型関数の起動は「StartCoroutine(Shot())」でしたね?

 

float shot_speed; //❹弾の速さ

float shotDelay; //❺弾を撃つ間隔

[SerializeField] GameObject EnemyBullet; //❻EnemyBulletを格納


IEnumerator Shot() //❼敵2攻撃のコルーチン関数

{

yield return new WaitForSeconds(5); //仮)5秒待つ

while (true) //内部の同じ動きを繰り返す

{

shotDelay = Random.Range(0.5f, 1.5f); //間隔を0.5秒から1.5秒の間の乱数で指定

yield return new WaitForSeconds(shotDelay); //指定した間隔待っ

GameObject Laser = Instantiate(EnemyBullet, transform.position, transform.rotation); //弾の生成

Laser.GetComponent<Rigidbody2D>().AddForce(EnemyBullet.transform.up * shot_speed); //弾に速度を与える

}

}


void Start()

{

shot_speed = 300; //❽弾の速さ

enemyRb2d = GetComponent<Rigidbody2D>(); //記述済み

StartCoroutine(Move()); //記述済み

StartCoroutine(Shot()); //❾コルーチンを起動

}

 

これで今回のプログラムは完成。

⑬最後は「Enemy2」のHierarchyで上で作成した「EnemyBullet」のプレファブを指定しておきます。

ではこの状態で動かしてみましょう。ちょっと遅めの弾がEnemy2から撃たれるのを確認できたと思います。

 

今回はここまでです。


教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。

お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。


お問い合わせは こちら から。

体験授業のお申込みは こちら から。


過去の作品はこちらから。

Vol.01~Vol.10 は下のVol.11 文末のリンクからどうぞ

最新記事

すべて表示

ファイブボックス 上田教室

bottom of page