1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- 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<GameObject> carModels;
- public List<GameObject> pooledCars;
- public int poolSize;
- public float standardRayLength = 5;
- public bool randomizeRayLength = false;
- public float rayRandomizeRange = 4;
- void Awake() {
- SharedInstance = this;
- pooledCars = new List<GameObject>();
- GameObject tmpInstance;
- for(int i = 0; i < poolSize; i++){
- tmpInstance = Instantiate(carModels[Random.Range (0, carModels.Count)]);
- VehicleAI vAI = tmpInstance.GetComponent<VehicleAI>();
- if(vAI == null){
- Debug.Log("Carmodel has no AI. Destorying Instance!");
- Destroy(tmpInstance);
- continue;
- }
- vAI.trafficSystem = this.trafficSystem;
- vAI.raycastLength = standardRayLength;
- CarSitter carSitter = tmpInstance.GetComponent<CarSitter>();
- 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<VehicleAI>();
- ai.vehicleStatus = Status.GO;
- //If given, randomize RaycastLength
- if (this.randomizeRayLength)
- {
- ai.raycastLength = Random.Range(this.standardRayLength - this.rayRandomizeRange,
- this.standardRayLength + rayRandomizeRange);
- }
-
- car.SetActive(true);
- }
- }
- }
|