using UnityEngine; using System.Collections; using System.Collections.Generic; namespace TrafficSimulation{ public class CarSituationSpawner : MonoBehaviour { public float spawnRate = 5.0f; public GameObject[] spawns; public bool despawnerActive; 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 && this.despawnerActive){ 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(GameObject spawn in spawns){ SpawnWatcher spWatch = spawn.GetComponent(); IEnumerator coroutine = AutoSpawning(spawn.transform,spWatch); 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,SpawnWatcher spWatch){ while(true){ if (spWatch.spawnIsFree) { SpawnCar(position); } yield return new WaitForSeconds(this.spawnRate); } } } }