- Home /
Advanced Wave Spawner.
Hi, how can I make different enemies spawn at certain spawnpoints, and not at random spawnpoints, as now in my script. Can I do it in wave spawner? For example rotating platforms spawn at (0,0,) and enemies at (10,10) and etc. Here's my current script if you need one:
`public class WaveSpawner : MonoBehaviour
`{
public enum SpawnState {SPAWNING, WAITING, COUNTING};
[System.Serializable]
public class Wave
{
public string name;
public Transform enemy;
public int count;
public float rate;
}
public Wave[] waves;
private int nextWave = 0;
public float timeBetweenWaves = 5f;
private float waveCountdown;
private SpawnState state = SpawnState.COUNTING;
private float searchCountdown = 1f;
public Transform[] spawnPoints;
void Start()
{
waveCountdown = timeBetweenWaves;
}
void Update()
{
if(state == SpawnState.WAITING)
{
if(!EnemyIsAlive())
{
WaveCompleted();
}
else
{
return;
}
}
if(waveCountdown <= 0)
{
if (state != SpawnState.SPAWNING)
{
StartCoroutine(SpawnWave(waves[nextWave]));
}
}
else
{
waveCountdown -= Time.deltaTime;
}
}
void WaveCompleted()
{
Debug.Log("Wave Completed");
state = SpawnState.COUNTING;
waveCountdown = timeBetweenWaves;
if(nextWave + 1 > waves.Length -1)
{
nextWave = 0;
Debug.Log("Completed all waves! Looping");
} else {
nextWave++;
}
}
bool EnemyIsAlive()
{
searchCountdown -= Time.deltaTime;
if(searchCountdown <= 0f)
{
searchCountdown = 1f;
if(GameObject.FindGameObjectsWithTag("Enemy") == null)
{
return false;
}
}
return true;
}
IEnumerator SpawnWave (Wave _wave) //want to wate a certain amount of seconds in metod
{
state = SpawnState.SPAWNING;
for(int i=0;i< _wave.count; i++)
{
SpawnEnemy(_wave.enemy);
yield return new WaitForSeconds(1f/_wave.rate);
}
state = SpawnState.WAITING;
yield break;
}
void SpawnEnemy (Transform _enemy)
{
//SpawnEnemy
Debug.Log("Spawning Enemy" +_enemy.name);
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length)];
Instantiate (_enemy, _sp.position, _sp.rotation);
}``
Answer by Aviryx · Aug 16, 2020 at 06:40 PM
Well you have a list of transforms for your spawn points.
public Transform[] spawnPoints;
So you can get a list of spawn points.
foreach (Transform spawnpoint in spawnPoints)
{
Debug.Log(spawnpoint);
}
You could also specify a particular spawn point like this
spawnPoints[0]
What you are currently doing is just spawning between spawn point 0 and the last spawn point.
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length)];
This means you would need to check for an enemy type, and if it matches, spawn it at your preferred locations.
if (_enemy.name == "Enemy 1")
{
Transform _sp = spawnPoints[0];
}
else
{
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length)];
}
or maybe
List<Transform> enemy1SpawnPoints = new List<Transform>();
enemy1SpawnPoints.Add(spawnPoints[0]);
enemy1SpawnPoints.Add(spawnPoints[4]);
if (_enemy.name == "Enemy 1")
{
var result = enemy1SpawnPoints[Random.Range (0, enemy1SpawnPoints.Length)];
Transform _sp = spawnPoints[result];
}
else
{
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length)];
}
Your answer
Follow this Question
Related Questions
Question about Unet and spawning 0 Answers
Spawn object with time difference 2 Answers
Spawn Objects on Walkable Surfaces 1 Answer
How to increase the spawn rate of an object over time? 2 Answers