using UnityEngine; using System.Collections; using System.Collections.Generic; namespace TrafficSimulation{ public class CarSituationSpawner : MonoBehaviour { public float spawnRate = 5.0f; public Transform[] spawns; public PresetTrigger[] despawns; public CarPool carPool; private List coroutines = new List(); private bool isActive; private List cars = new List(); // Use this for initialization void Start() { this.isActive = false; } // Update is called once per frame void Update() { if(this.isActive){ CheckDespawns(); } } void OnDestroy() { StopSpawning(); } /// /// Use this method to active the spawner /// public void StartSpawner(){ this.isActive = true; StartSpawns(); } /// /// Use this method to deactive the spawner /// public void StopSpawner(){ this.isActive = false; StopSpawning(); DespawnAllCars(); } /// /// Check every set despawn area if cars have to be despawned /// private void CheckDespawns(){ foreach(PresetTrigger despawn in despawns){ if(despawn.checkLastTrigger()){ DespawnCar(despawn.getLastCollider()); } } } /// /// Start a coroutine to spawn cars at every given spawn point /// private void StartSpawns(){ foreach(Transform spawnPos in spawns){ IEnumerator coroutine = AutoSpawning(spawnPos); this.coroutines.Add(coroutine); StartCoroutine(coroutine); } } /// /// Despawn all cars used from this spawner since it was active /// private void DespawnAllCars(){ this.cars.ForEach(car => DespawnCar(car)); } /// /// Stop all coroutines /// private void StopSpawning(){ foreach(IEnumerator coroutine in this.coroutines){ StopCoroutine(coroutine); } } /// /// Spawn a car on the given transform /// /// Transform void SpawnCar(Transform carSpawn){ this.cars.Add(this.carPool.SpawnCar(carSpawn)); } /// /// Despawn the given car /// /// GameObject void DespawnCar(GameObject car){ this.carPool.despawnCar(car); } /// /// IEnumerator for the coroutine which spawns a car at the given position in the set spawnRate /// /// Transform /// public IEnumerator AutoSpawning(Transform position){ while(true){ SpawnCar(position); yield return new WaitForSeconds(this.spawnRate); } } } }