using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Assertions.Must; using UnityEngine.Serialization; namespace TrafficSimulation{ public class CarPool : MonoBehaviour { public TrafficSystem trafficSystem; public static CarPool SharedInstance; public List carModels; public List pooledCars; public int poolSize; public bool randomizeRayLength = false; public int rayRandomizeRange = 4; void Awake() { SharedInstance = this; pooledCars = new List(); GameObject tmpInstance; for(int i = 0; i < poolSize; i++){ tmpInstance = Instantiate(carModels[Random.Range (0, carModels.Count)]); VehicleAI vAI = tmpInstance.GetComponent(); if(vAI == null){ Debug.Log("Carmodel has no AI. Destorying Instance!"); Destroy(tmpInstance); continue; } vAI.trafficSystem = this.trafficSystem; CarSitter carSitter = tmpInstance.GetComponent(); if(carSitter != null){ carSitter.carPool = this; } tmpInstance.SetActive(false); pooledCars.Add(tmpInstance); } } public GameObject GetCar(){ foreach(GameObject car in pooledCars){ if(!car.activeInHierarchy){ return car; } } Debug.Log("no car free to use. returning null!"); return null; } public GameObject SpawnCar(Transform spawnTranform){ return SpawnCar(spawnTranform.position, spawnTranform.rotation, null); } public GameObject SpawnCar(Vector3 spawnPos, Quaternion spawnRot, Transform lookAt) { GameObject car = this.GetCar(); if (car == null) { Debug.Log("No car was available. Spawn aborted"); return null; } PrepareCarToSpawn(car, spawnPos, spawnRot, lookAt); return car; } public void DespawnCar(GameObject car){ car.SetActive(false); } private void PrepareCarToSpawn(GameObject car,Vector3 position, Quaternion rotation,Transform lookAt) { //Position + Rotation + Lookat car.transform.position = position; car.transform.rotation = rotation; if(lookAt != null) { car.transform.LookAt(lookAt); } //Status correction. Necessary when the car was despawned while in intersection VehicleAI ai = car.GetComponent(); ai.vehicleStatus = Status.GO; //If given, randomize RaycastLength if (this.randomizeRayLength) { float defaultLength = ai.raycastLength; ai.raycastLength = Random.Range(defaultLength - this.rayRandomizeRange, defaultLength + rayRandomizeRange); } car.SetActive(true); } } }