private void Start()
 {
     if (NPCar == null)
     {
         NPCar = GetComponentInParent <CarAIController>();
     }
 }
Exemple #2
0
    /// <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--;
        }
    }
Exemple #4
0
    /// <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();
    }
Exemple #5
0
    public void AddAICar(CarAIController carAI)
    {
        var AICar = carAI.GetComponent <CarAIController>();

        if (AICar != null)
        {
            AICarSet.Add(AICar);
            AICarSetGOs.Add(AICar);
        }
    }
Exemple #6
0
    public CarAIController GetRandomAICarGO()
    {
        CarAIController carAIController = null;

        if (AICarSetGOs.Count != 0)
        {
            int index = (int)Random.Range(0, AICarSetGOs.Count);
            carAIController = AICarSetGOs[index];
        }

        return(carAIController);
    }
Exemple #7
0
    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;
    }
Exemple #9
0
    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);
        }
    }
Exemple #10
0
    public bool IsCarInMainView(CarAIController carAI)
    {
        var collider = carAI.GetComponent <Collider>();

        if (GeometryUtility.TestPlanesAABB(mainCamFrustumPlanes, collider.bounds))
        {
            return(true);
        }
        else
        {
            return(false);
        }
    }
Exemple #11
0
    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);
        }
    }
Exemple #12
0
 /// <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);
         }
     }
 }
Exemple #13
0
 /// <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;
                }
            }
        }
    }
Exemple #15
0
    //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);
        }
    }
Exemple #16
0
 void Awake()
 {
     motor           = GetComponent <TrafAIMotor>();
     carAIController = GetComponent <CarAIController>();
 }
Exemple #17
0
 public bool RemoveAICar(CarAIController carAI)
 {
     // TODO Eric check
     AICarSetGOs.Remove(carAI);
     return(AICarSet.Remove(carAI));
 }
Exemple #18
0
    public void CanGoToCrossroad(CarAIController car)
    {
        bool canGo = CanGoToCrossroad(car, HasSomeoneRight(ReturnCarsMovementDir(car)), ReturnCarsMovementDir(car));

        car.CanGoToCrossroad = canGo;
    }
Exemple #19
0
    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);
        }
    }
Exemple #20
0
    public GameObject Spawn(int id, int subId, bool unseenArea = false, CarAIController sameCar = null)
    {
        TrafEntry entry = system.GetEntry(id, subId);

        return(Spawn(entry, unseenArea, sameCar));
    }
Exemple #21
0
    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);
        }
    }