Unityで作る「シューティングゲーム」。前回は「敵2」の通常の動きが完成しました。今回の課題は次の2つ。
1、登場シーンの作成(シールドも含む)
2、出現管理
では早速作っていきましょう。
1,登場シーンの作成
「敵1」で登場時にシールドを作成したの、覚えていますか?今回も同様な手順で「敵2」にシールドを持たせてあげて、配置についた段階でシールドを外してやりたいと思います。
①まずは取得済みのアセット [2D Space Kit] =>[Particles] からシールドの素材を取得し、Hierarchyにドラッグ&ドロップで取り込みます。
②「Enemy2」にドラッグ&ドロップ、「Enemy2」の子要素として配置します。
③シールドの名前を変更しましょう。「Enemy2Shield」に変更
④Tagに作成済みの「Enemy」をセットします
⑤positionは子要素なので、親要素に対する相対値となります。3軸とも0にしておきましょう。
大きさを50%にします。Scaleのx,y、それぞれ0.5を指定。
⑥Colorは赤系にしておきます。
⑦Sorting Layer を作成済みの「Enemy」にします。
⑧CircleCollider2D を追加します。
EidtCollider で大きさをシールドの大きさに合わせます。
⑨「Is Trigger」にチェックを入れて完成。
続いてプログラミングを記述していきましょう。
まずは「Enemy2Controller.cs」を立ち上げて、以下のコード(1行だけ)を追加します。
❶登場シーンが終わったところで、子要素のシールドを削除するプログラムです。
Enemy1のシールドを削除したプログラムと同じです。
//敵の登場とその後の動き(シールドの削除のみ追記)
IEnumerator Move()
{
transform.position = new Vector3(Random.Range(-15f,15f), 12f, 0); //記述済み
enemyRb2d.velocity = new Vector2(0, -1f); //記述済み
yield return new WaitForSeconds(3); //記述済み
enemyRb2d.velocity = transform.up * 0; //記述済み
yield return new WaitForSeconds(0.5f); //記述済み
Destroy(transform.GetChild(0).gameObject); //❶シールドを削除す
IsMove = true; //記述済み
while (transform.position.y>-10f) //記述済み
{
float moveX = Random.Range(-7.0f, 7.0f); //記述済み
enemyRb2d.velocity = transform.right * moveX; //記述済み
yield return new WaitForSeconds(2); //記述済み
enemyRb2d.velocity = transform.right * 0; //記述済み
yield return new WaitForSeconds(0.5f); //記述済み
enemyRb2d.velocity = new Vector2(0, -2f); //記述済み
yield return new WaitForSeconds(1); //記述済み
}
Destroy(gameObject); //記述済み
}
これで「Enemy2」が完成しました。
⑩最後にProjectにドラッグ&ドロップで、プレファブ化しておきましょう。
「Enemy2」ですが、「Enemy1」が倒されたタイミングで画面上部から出現するようにします。ということは「Enemy1」のプログラムを改造する必要がありそうですね?
「Enemy2Controller.cs」を立ち上げて以下のコードを追加します。
❷生成する「Enemy2」のプレファブを変数で指定。
❸自分自身が倒されて削除されるタイミングで、指定した「Enemy2」をInstantiate()関数で生成します。
[SerializeField] GameObject enemy2; //❷Enemy2プレハブ
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Projectile" && IsMove) //記述済み
{
Destroy(collision.gameObject); //記述済み
hp--; //記述済み
if (hp == 0) //記述済み
{
GameObject effect = Instantiate(explosion, transform.position, transform.rotation); //記述済み
Destroy(effect, 1.5f); //記述済み
Destroy(gameObject); //記述済み
gameManager.enemyCount--; //記述済み
gameManager.AddScore(100); //記述済み
Instantiate(enemy2); //❸Enemy2の生成
}
}
}
これで「GameManager」が6体の敵(Enemy1)を作り、それぞれ倒されたタイミングで新たな敵(Enemy2)が発生するプログラミングができました。
⑪最後は❷で指定した変数「Enemy2」に⑩で作成した「Enemy2」のプレファブを指定します。
だいぶにぎやかなゲームになってきました。次回は何をしようかな?
今のプログラムではEnemy1を6体倒したら、再度Enemy1が6体出てきますね?
このループを3回にして、いったん「BOSS」を出現させてみたいと思います。
今回はここまでです。
教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。
お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。
過去の作品はこちらから。
Vol.01~Vol.10 は下のVol.11 文末のリンクからどうぞ
コメント