private void Start() { if (NPCar == null) { NPCar = GetComponentInParent <CarAIController>(); } }
/// <summary> /// Add car to moves from list /// </summary> /// <param name="movesFrom"></param> /// <param name="car"></param> public void AddCarToList(int movesFrom, CarAIController car) { switch (movesFrom) { case 0: if (!carsForward.Contains(car)) { carsForward.Add(car); } break; case 1: if (!carsBackward.Contains(car)) { carsBackward.Add(car); } break; case 2: if (!carsLeft.Contains(car)) { carsLeft.Add(car); } break; case 3: if (!carsRight.Contains(car)) { carsRight.Add(car); } break; } SendCheckToAllCars(); }
void OnTriggerExit(Collider col) { CarAIController cop = col.GetComponent <CarAIController>(); if (cop != null) { CopCount--; } }
/// <summary> /// Remove car from all moves lists /// </summary> /// <param name="car"></param> public void RemoveCarFromLists(CarAIController car) { carsForward.Remove(car); carsBackward.Remove(car); carsLeft.Remove(car); carsRight.Remove(car); car.CanGoToCrossroad = true; SendCheckToAllCars(); }
public void AddAICar(CarAIController carAI) { var AICar = carAI.GetComponent <CarAIController>(); if (AICar != null) { AICarSet.Add(AICar); AICarSetGOs.Add(AICar); } }
public CarAIController GetRandomAICarGO() { CarAIController carAIController = null; if (AICarSetGOs.Count != 0) { int index = (int)Random.Range(0, AICarSetGOs.Count); carAIController = AICarSetGOs[index]; } return(carAIController); }
public static bool CheckSilentRespawnEligibility(CarAIController car, Camera cam) { var distToCam = (car.transform.position - cam.transform.position).magnitude; if (distToCam > (TrafPerformanceManager.Instance.carRendDistanceThreshold + 25f) || (distToCam > 90f && !TrafPerformanceManager.Instance.IsCarInMainView(car))) { return(true); } else { return(false); } }
private void CarInitialize(ref CarAIController carAIController) { float speed = moveSpeed + Random.Range(moveSpeed * -0.15f, moveSpeed * 0.15f); speed = Mathf.Clamp(speed, 0, 15); carAIController.MOVE_SPEED = speed; carAIController.INCREASE = speadIncrease; carAIController.DECREASE = speadDecrease; carAIController.TO_CAR = distanceToCar; carAIController.TO_SEMAPHORE = distanceToSemaphore; carAIController.MaxAngle = maxAngleToMoveBreak; }
public static bool CheckSilentRespawnEligibility_Old(CarAIController car, Camera cam) { var distToCam = (car.transform.position - cam.transform.position).magnitude; if (distToCam > (TrafPerformanceManager.Instance.carRendDistanceThreshold + 25f) || (distToCam > 90f && car.allRenderers.All <Renderer>(r => !r.isVisible))) { return(true); } else { return(false); } }
public bool IsCarInMainView(CarAIController carAI) { var collider = carAI.GetComponent <Collider>(); if (GeometryUtility.TestPlanesAABB(mainCamFrustumPlanes, collider.bounds)) { return(true); } else { return(false); } }
public bool SpawnInArea(bool mustSpawn = false, bool unseenArea = false, CarAIController sameCar = null) { if (trafficSpawnAreas.Count < 1) { return(false); } utilEntryList.Clear(); foreach (var entry in system.entries) { if (entry.waypoints.Count < 2) { continue; } var start = entry.waypoints[0]; var end = entry.waypoints[entry.waypoints.Count - 1]; var estAvgPoint = (start + end) * 0.5f; if (trafficSpawnAreas.Any(x => x.Contains(estAvgPoint)) || trafficSpawnAreas.Any(x => x.Contains(start)) || trafficSpawnAreas.Any(x => x.Contains(end))) { utilEntryList.Add(entry); } } int tryCount = 0; GameObject go; do { var e = utilEntryList[Random.Range(0, utilEntryList.Count)]; go = Spawn(e, unseenArea, sameCar); tryCount++; } while (go == null && mustSpawn && tryCount < 41); if (mustSpawn && tryCount > 40 && go == null) { Debug.Log("Run out of try counts to make a legit car spawn within area, try random spawn"); return(SpawnRandom(mustSpawn, unseenArea, sameCar)); } else { return(true); } }
/// <summary> /// Check if car can go to the crossroad extended /// </summary> /// <param name="car"></param> /// <param name="someOneRight"></param> /// <param name="curDir"></param> /// <returns></returns> private bool CanGoToCrossroad(CarAIController car, bool someOneRight, int curDir) { if (!someOneRight /*&& (car.GetCarTurnPath() == 2 ? !CarTurningLeftOnCrossroad(curDir) : true)) */ || car.GetCarTurnPath() == 0) { return(true); } else { if (IsAllPathesBusy() && curDir == 2) { return(true); } else { return(false); } } }
/// <summary> /// Search car in lists and return moves from direction /// </summary> /// <param name="car"></param> /// <returns></returns> private int ReturnCarsMovementDir(CarAIController car) { if (carsForward.Contains(car)) { return(0); } else if (carsBackward.Contains(car)) { return(1); } else if (carsLeft.Contains(car)) { return(2); } else { return(3); } }
public static void CarInView(GameObject go, Rigidbody rigbody, float distance, float startSpeed, ref float moveSpeed, ref bool tempStop, float distanceToCar = 15) { if (go == null) { return; } CarAIController car = go.GetComponent <CarAIController>(); if (distance >= distanceToCar) { if (car.TEMP_STOP) { moveSpeed = startSpeed * 0.5f; } else { moveSpeed = startSpeed; } tempStop = false; } else if (distance < distanceToCar) { if (car.GetComponent <Rigidbody>().velocity.magnitude < rigbody.velocity.magnitude) { tempStop = true; } else { if (!car.TEMP_STOP) { tempStop = false; } } } }
//Spawn randomly public bool SpawnRandom(bool mustSpawn = false, bool unseenArea = false, CarAIController sameCar = null) { int id, subId; int tryCount = 0; GameObject go; do { id = Random.Range(0, maxIdent); subId = Random.Range(0, maxSub); go = Spawn(id, subId, unseenArea, sameCar); tryCount++; } while (go == null && mustSpawn && tryCount < 41); if (mustSpawn && tryCount > 40 && go == null) { Debug.Log("Run out of try counts to make a legit car spawn"); return(false); } else { return(true); } }
void Awake() { motor = GetComponent <TrafAIMotor>(); carAIController = GetComponent <CarAIController>(); }
public bool RemoveAICar(CarAIController carAI) { // TODO Eric check AICarSetGOs.Remove(carAI); return(AICarSet.Remove(carAI)); }
public void CanGoToCrossroad(CarAIController car) { bool canGo = CanGoToCrossroad(car, HasSomeoneRight(ReturnCarsMovementDir(car)), ReturnCarsMovementDir(car)); car.CanGoToCrossroad = canGo; }
private void LoadWorld(WorldData worldData) { GameManager.Instance.SetGoalAtStart(worldData.BadAssGoal); //LOAD TILES foreach (TileData tile in worldData.Tiles) { TileController tileController = Instantiate(tile.TilePrefab); tileController.transform.SetParent(TileParent); tileController.transform.eulerAngles = new Vector3(0, tile.Rotation, 0); tileController.transform.position = tile.Position; LoadedTiles.Add(tileController); bool canHaveBuilding = false; foreach (TileController tileC in TileSetData.TilesThatCanHaveBuildingsOnThem) { if (tile.TilePrefab.name == tileC.name) { canHaveBuilding = true; break; } } if (canHaveBuilding) { int chanceToSpawnHouse = 70; if (chanceToSpawnHouse > Random.Range(0, 100)) { int randomInt = Random.Range(0, TileSetData.BuildingTiles.Length); bool rotate = Random.Range(0, 2) > 0; TileController buildingTileController = Instantiate(TileSetData.BuildingTiles[randomInt]); buildingTileController.transform.SetParent(tileController.transform); buildingTileController.transform.eulerAngles = new Vector3(0, rotate ? 90 : 0, 0); buildingTileController.transform.localPosition = new Vector3(-0.5f, 0.6f, -0.5f); } } bool canHaveTrees = false; foreach (TileController tileC in TileSetData.TilesThatCanHaveTreesOnThem) { if (tile.TilePrefab.name == tileC.name) { canHaveTrees = true; break; } } if (canHaveTrees) { int chanceToSpawnTrees = 80; if (chanceToSpawnTrees > Random.Range(0, 100)) { int randomInt = Random.Range(0, TileSetData.TreeTiles.Length); int rotate = Random.Range(0, 4); TileController treeTileController = Instantiate(TileSetData.TreeTiles[randomInt]); treeTileController.transform.SetParent(tileController.transform, false); treeTileController.transform.eulerAngles = new Vector3(0, 90 * rotate, 0); } } } //LOAD HUMANS HumanSpawner humanSpawnerPrefab = LevelManager.Instance.GetHumanSpawnerPrefab(); foreach (HumanSpawnerData data in worldData.HumanSpawnerDatas) { HumanSpawner humanSpawner = Instantiate(humanSpawnerPrefab); humanSpawner.transform.SetParent(HumanSpawnerParent); humanSpawner.Init(data); HumanSpawners.Add(humanSpawner); } //LOAD CAR AI CarAIController carAIControllerPrefab = LevelManager.Instance.GetCarAiControllerPrefab(); foreach (CarAIData data in worldData.CarAIDatas) { CarAIController carAiController = Instantiate(carAIControllerPrefab); carAiController.transform.SetParent(CarAIParent); carAiController.Init(data); CarAIControllers.Add(carAiController); } }
public GameObject Spawn(int id, int subId, bool unseenArea = false, CarAIController sameCar = null) { TrafEntry entry = system.GetEntry(id, subId); return(Spawn(entry, unseenArea, sameCar)); }
public GameObject Spawn(TrafEntry entry, bool unseenArea = false, CarAIController sameCar = null) { if (entry == null) { return(null); } float distance = Random.value * 0.8f + 0.1f; InterpolatedPosition pos = entry.GetInterpolatedPosition(distance); if (!Physics.CheckSphere(pos.position, checkRadius, NPCSpawnCheckBitmask)) { GameObject go; if (sameCar != null) //If it is the same car simply reposition it { go = sameCar.gameObject; go.transform.position = pos.position + Vector3.up; } else { go = GameObject.Instantiate(prefabs[Random.Range(0, prefabs.Length)], pos.position + Vector3.up * 3.5f, Quaternion.identity) as GameObject; } go.transform.LookAt(entry.waypoints[pos.targetIndex]); go.transform.SetParent(this.transform); // Put all spawned cars under this object for better organization var carAI = go.GetComponent <CarAIController>(); if (unseenArea) { if (!CheckSilentRespawnEligibility(carAI, Camera.main)) { if (sameCar == null) { DestroyImmediate(go); } return(null); } } else if (sameCar == null) //If it is a new spawn { //assign userid if (trafInfoManager.freeIdPool.Count == 0) { carAI.carID = trafInfoManager.GeneratePseudoRandomUID(); } else { carAI.carID = trafInfoManager.freeIdPool.Dequeue(); } carAI.RandomSelectCarPaintTexture(); ++totalTrafficCarCount; if (trafPerfManager != null) { trafPerfManager.AddAICar(carAI); } } // Init or Reinit AI motor TrafAIMotor motor = go.GetComponent <TrafAIMotor>(); motor.system = system; motor.Init(pos.targetIndex, entry); // Init or Reinit AI Controller carAI.Init(); return(go); } else { return(null); } }