前回までの作業で、今回のシューティングゲームの敵キャラに相当する隕石を作ることができました。次はその隕石を一定間隔で生成する仕組みを作りましょう。
敵キャラ生成オブジェクトの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」など大きい値にしてみてください。
次のページ→自機が画面外に出ないようにする方法
