プレイするゲームがないなら、自分で作ればいいじゃない!
ということで Unity 初心者が「ゲームを作る」ゲームをやっていきます!
今回は「敵をランダムで生成してみた」の記事です
内容
敵の位置や種類をランダムな値を使って生成する
敵の生成方法を考える
今はただ敵が2体配置されているだけ
これではつまらないので、敵を生成する何かを作りたい
どうやって生成するかを考える
パっと出てくるのは
- 時間でランダム
- 時間、位置、種類等を細かく設定する
細かく設定すると時間がかかるので、今回はランダムでやってみることに
敵を生成するオブジェクトを作る
「時間、位置、種類」を設定したら勝手に生み出す感じです
空のオブジェクトを作成して⇒スクリプトを追加
ランダム生成のスクリプト
public class EnemyRandomGenerator : MonoBehaviour
{
[SerializeField] List<GameObject> enemyList; // 生成オブジェクト
[SerializeField] Transform pos; // 生成位置
[SerializeField] Transform pos2; // 生成位置
float minX, maxX, minY, maxY; // 生成範囲
int frame = 0;
[SerializeField] int generateFrame = 30; // 生成する間隔
void Start()
{
minX = Mathf.Min(pos.position.x, pos2.position.x);
maxX = Mathf.Max(pos.position.x, pos2.position.x);
minY = Mathf.Min(pos.position.y, pos2.position.y);
maxY = Mathf.Max(pos.position.y, pos2.position.y);
}
void Update()
{
++frame;
if (frame > generateFrame)
{
frame = 0;
// ランダムで種類と位置を決める
int index = Random.Range(0, enemyList.Count);
float posX = Random.Range(minX, maxX);
float posY = Random.Range(minY, maxY);
Instantiate(enemyList[index], new Vector3(posX, posY, 0), Quaternion.identity);
}
}
}
enemyList, pos, pos2, generateFrame の設定
Random.Range(min, max)
これで「min~max」の範囲でランダムな値を取得できる
int と float で動作が異なり
- int は min ~ max-1 の値を返す
- float は min ~ max の値を返す
(min,max) となっているが Range(10, -10) でも、
中で値を入れ替えてくれるので正常に動作する
サンプル動画
敵は生成できたが…
サンプル動画にも見られるように
- 同じ種類の敵が連続して出現
- 同じような位置で連続して出現
と、全てをランダムに任せると「ゲームの調整が難しくなってしまう」
これからアイテムを落とす等、要素を増やしていくとして
それらもランダムだと、より調整難易度が上がっていきます…
さいごに
ランダムに任せる仕様ではゲームを作るのは難しい…
ゲームにするためには仕様を練ることが大切なのだと知った
コメント