45 lines
1.6 KiB
C#
45 lines
1.6 KiB
C#
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
public class SpawnerController : MonoBehaviour {
|
|||
|
|
[SerializeField] private BoxCollider2D bounds;
|
|||
|
|
[SerializeField] private GameObject monsterToSpawn;
|
|||
|
|
|
|||
|
|
[SerializeField] private float spawnTick;
|
|||
|
|
[SerializeField] private int maxActiveSpawns;
|
|||
|
|
[SerializeField] private int maxSpawnPerTick;
|
|||
|
|
|
|||
|
|
[SerializeField] private bool isActive;
|
|||
|
|
|
|||
|
|
private List<GameObject> spawns;
|
|||
|
|
|
|||
|
|
private void Start() {
|
|||
|
|
spawns = new List<GameObject>();
|
|||
|
|
StartCoroutine("SpawnCoroutine");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void Spawn() {
|
|||
|
|
Vector3 spawnPosition = new Vector3(bounds.transform.position.x + bounds.size.x * Random.Range(-0.5f, 0.5f),
|
|||
|
|
bounds.transform.position.y + bounds.size.y,
|
|||
|
|
bounds.transform.position.z);
|
|||
|
|
GameObject monster = Instantiate(monsterToSpawn);
|
|||
|
|
monster.transform.position = spawnPosition;
|
|||
|
|
spawns.Add(monster);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private IEnumerator SpawnCoroutine() {
|
|||
|
|
while (true) {
|
|||
|
|
spawns.RemoveAll(spawn => spawn == null);
|
|||
|
|
if (isActive && spawns.Count < maxActiveSpawns) {
|
|||
|
|
// TODO: Check if num active spawns is > maxActiveSpawns.
|
|||
|
|
int numSpawns = Mathf.Min(maxActiveSpawns, spawns.Count + maxSpawnPerTick) - spawns.Count;
|
|||
|
|
for (int i = 0; i < numSpawns; i++) {
|
|||
|
|
Spawn();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
yield return new WaitForSeconds(spawnTick);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|