CarSituationSpawner.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace TrafficSimulation{
  5. public class CarSituationSpawner : MonoBehaviour
  6. {
  7. public float spawnRate = 5.0f;
  8. public GameObject[] spawns;
  9. public bool despawnerActive;
  10. public PresetTrigger[] despawns;
  11. public CarPool carPool;
  12. private List<IEnumerator> coroutines = new List<IEnumerator>();
  13. private bool isActive;
  14. private List<GameObject> cars = new List<GameObject>();
  15. // Use this for initialization
  16. void Start()
  17. {
  18. this.isActive = false;
  19. }
  20. // Update is called once per frame
  21. void Update()
  22. {
  23. if(this.isActive && this.despawnerActive){
  24. CheckDespawns();
  25. }
  26. }
  27. void OnDestroy() {
  28. StopSpawning();
  29. }
  30. /// <summary>
  31. /// Use this method to active the spawner
  32. /// </summary>
  33. public void StartSpawner(){
  34. this.isActive = true;
  35. StartSpawns();
  36. }
  37. /// <summary>
  38. /// Use this method to deactive the spawner
  39. /// </summary>
  40. public void StopSpawner(){
  41. this.isActive = false;
  42. StopSpawning();
  43. DespawnAllCars();
  44. }
  45. /// <summary>
  46. /// Check every set despawn area if cars have to be despawned
  47. /// </summary>
  48. private void CheckDespawns(){
  49. foreach(PresetTrigger despawn in despawns){
  50. if(despawn.checkLastTrigger()){
  51. DespawnCar(despawn.getLastCollider());
  52. }
  53. }
  54. }
  55. /// <summary>
  56. /// Start a coroutine to spawn cars at every given spawn point
  57. /// </summary>
  58. private void StartSpawns(){
  59. foreach(GameObject spawn in spawns){
  60. SpawnWatcher spWatch = spawn.GetComponent<SpawnWatcher>();
  61. IEnumerator coroutine = AutoSpawning(spawn.transform,spWatch);
  62. this.coroutines.Add(coroutine);
  63. StartCoroutine(coroutine);
  64. }
  65. }
  66. /// <summary>
  67. /// Despawn all cars used from this spawner since it was active
  68. /// </summary>
  69. private void DespawnAllCars(){
  70. this.cars.ForEach(car => DespawnCar(car));
  71. }
  72. /// <summary>
  73. /// Stop all coroutines
  74. /// </summary>
  75. private void StopSpawning(){
  76. foreach(IEnumerator coroutine in this.coroutines){
  77. StopCoroutine(coroutine);
  78. }
  79. }
  80. /// <summary>
  81. /// Spawn a car on the given transform
  82. /// </summary>
  83. /// <param name="carSpawn">Transform</param>
  84. void SpawnCar(Transform carSpawn){
  85. this.cars.Add(this.carPool.SpawnCar(carSpawn));
  86. }
  87. /// <summary>
  88. /// Despawn the given car
  89. /// </summary>
  90. /// <param name="car">GameObject</param>
  91. void DespawnCar(GameObject car){
  92. this.carPool.DespawnCar(car);
  93. }
  94. /// <summary>
  95. /// IEnumerator for the coroutine which spawns a car at the given position in the set spawnRate
  96. /// </summary>
  97. /// <param name="position">Transform</param>
  98. /// <returns></returns>
  99. public IEnumerator AutoSpawning(Transform position,SpawnWatcher spWatch){
  100. while(true){
  101. if (spWatch.spawnIsFree)
  102. {
  103. SpawnCar(position);
  104. }
  105. yield return new WaitForSeconds(this.spawnRate);
  106. }
  107. }
  108. }
  109. }