69 lines
1.9 KiB
C#
69 lines
1.9 KiB
C#
using UnityEngine;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
|
|
public class WaveSpawner : MonoBehaviour
|
|
{
|
|
[System.Serializable]
|
|
public class Wave
|
|
{
|
|
public GameObject enemyPrefab; // Enemy prefab to spawn
|
|
public int count = 5; // Number of enemies in this wave
|
|
public float spawnRate = 1f; // Enemies per second (1 = 1/sec)
|
|
}
|
|
|
|
[Header("Setup")]
|
|
public Wave[] waves;
|
|
public Transform spawnPoint;
|
|
[Tooltip("Optional parent to keep the hierarchy tidy")]
|
|
public Transform containerParent;
|
|
public float timeBetweenWaves = 5f;
|
|
public bool autoStart = false;
|
|
|
|
public bool IsSpawning { get; private set; }
|
|
public bool AllWavesDone { get; private set; }
|
|
|
|
public readonly List<EnemyBase> spawned = new List<EnemyBase>();
|
|
|
|
void Start()
|
|
{
|
|
if (autoStart) StartSpawning();
|
|
}
|
|
|
|
public void StartSpawning()
|
|
{
|
|
if (IsSpawning || AllWavesDone) return;
|
|
StartCoroutine(SpawnRoutine());
|
|
}
|
|
|
|
IEnumerator SpawnRoutine()
|
|
{
|
|
IsSpawning = true;
|
|
AllWavesDone = false;
|
|
|
|
for (int w = 0; w < waves.Length; w++)
|
|
{
|
|
var wave = waves[w];
|
|
for (int i = 0; i < wave.count; i++)
|
|
{
|
|
SpawnEnemy(wave.enemyPrefab);
|
|
yield return new WaitForSeconds(1f / Mathf.Max(0.0001f, wave.spawnRate));
|
|
}
|
|
|
|
if (w < waves.Length - 1)
|
|
yield return new WaitForSeconds(timeBetweenWaves);
|
|
}
|
|
|
|
IsSpawning = false;
|
|
AllWavesDone = true;
|
|
}
|
|
|
|
void SpawnEnemy(GameObject enemyPrefab)
|
|
{
|
|
if (enemyPrefab == null || spawnPoint == null) return;
|
|
|
|
var go = Instantiate(enemyPrefab, spawnPoint.position, spawnPoint.rotation, containerParent);
|
|
var eb = go.GetComponent<EnemyBase>();
|
|
if (eb != null) spawned.Add(eb);
|
|
}
|
|
} |