前回までの作業で、今回のシューティングゲームの敵キャラに相当する隕石を作ることができました。次はその隕石を一定間隔で生成する仕組みを作りましょう。
敵キャラ生成オブジェクトのC#スクリプト
では早速ですが敵キャラ生成オブジェクトのC#スクリプトを書いていきます。新しいC#スクリプトを作り、名前を「MeteorSpawner」に変更して次のコードを書いてください。
using System.Collections; using UnityEngine; public class MeteorSpawner : MonoBehaviour { enum MeteorSize { Small, Medium, Large, } public bool isActive = false; [SerializeField] GameObject meteorPrefab = null; [SerializeField, Min(0)] float minMeteorSpeed = 1; [SerializeField, Min(0)] float maxMeteorSpeed = 4; [SerializeField, Range(-90, 90)] float minAngleZ = 0; [SerializeField, Range(-90, 90)] float maxAngleZ = 0; [SerializeField, Min(0.1f)] float minSpawnInterval = 1; [SerializeField, Min(0.1f)] float maxSpawnInterval = 3; bool spawning = false; void Update() { if (isActive && !spawning) { StartCoroutine(nameof(SpawnTimer)); } } IEnumerator SpawnTimer() { spawning = true; yield return new WaitForSeconds(Random.Range(minSpawnInterval, maxSpawnInterval)); SpawnMeteor(); spawning = false; } void SpawnMeteor() { GameObject meteorObj; MeteorController meteor; Vector3 scale = Vector3.one; Quaternion rotation = Quaternion.Euler(Vector3.forward * Random.Range(minAngleZ, maxAngleZ)); // 隕石の発射角度 int hpMultiplier = 1; int scoreMultiplier = 1; // enum「MeteorSize」の要素数を取得 int sizeCount = System.Enum.GetNames(typeof(MeteorSize)).Length; // 隕石の大きさを決定 int choosedSize = Random.Range(0, sizeCount); // intをenumに変換し、サイズやHP等を設定 switch ((MeteorSize)System.Enum.ToObject(typeof(MeteorSize), choosedSize)) { case MeteorSize.Medium: hpMultiplier = 2; scoreMultiplier = 2; scale *= 1.5f; break; case MeteorSize.Large: hpMultiplier = 3; scoreMultiplier = 3; scale *= 2; break; } meteorObj = Instantiate(meteorPrefab, transform.position, rotation * transform.rotation); meteorObj.transform.localScale = scale; meteor = meteorObj.GetComponent<MeteorController>(); meteor.hp *= hpMultiplier; meteor.score *= scoreMultiplier; meteor.speed = Random.Range(minMeteorSpeed, maxMeteorSpeed); } }
書けたらこれを新しい空のゲームオブジェクト(※名前は「Meteor Spawner」にしてください)にアタッチしましょう。
C#スクリプトの解説
少しだけ長いスクリプトですが、やっていることは単純で「ランダムな間隔で、あらかじめ決まったサイズの隕石をランダムに生成する」という処理内容になっています。
SpawnTimer
ランダムな間隔で(後述する)SpawnMeteor関数を呼び出すコルーチンです。
SpawnMeteor
実際の隕石生成処理です。少しごちゃごちゃしたコードになってしまいましたが、処理内容は次の通りとなっています。
- 隕石の大きさを決定する
- 隕石のゲームオブジェクトを生成する
- 隕石の大きさに応じて必要なパラメーターを変更する
アタッチした「Meteor Spawner」コンポーネントを設定
あとはMeteor Spawnerコンポーネントの設定を行うだけです。「Meteor Prefab」に前回作った隕石のプレハブを登録し、あとのパラメーターは適当に変更しておいてください。
ここまでできたらMeteor Spawnerオブジェクトをプレハブ化しておきましょう。
テストプレイして動作を確認しよう
では最後にテストプレイして動作を確認しておきます。シーンの適当な場所にMeteor Spawnerオブジェクトを配置し、「Meteor Spawner」コンポーネントの「Is Active」にチェックを入れてから再生ボタンを押してみてください。
- ランダムな間隔で
- ランダムな方向に
- ランダムな大きさの隕石が
生成されれば成功です。
なお今の状態では大きい隕石に弾を当てた時に、隕石が弾かれて飛んで行ってしまうと思います。これだと大きな隕石を破壊しづらいので、隕石のリジッドボディの質量を「1000」など大きい値にしてみてください。
次のページ→自機が画面外に出ないようにする方法