/// <summary> /// Méthode pour ajouter les voitures extérieures d'une même couleur /// </summary> /// <param name="car">Préfab de la voiture extérieure</param> /// <param name="nbCars">Nombre de voitures à ajouter</param> /// <param name="numberExit">Numéro de la position de la sortie des voitures de même couleur</param> private IEnumerator AddExtColorCar(GameObject car, int nbCars, int numberExit, int nbTrust1, int nbTrust2, int nbTrust3, int nbTrust4, int nbTrust5, int nbGenerosity1, int nbGenerosity2, int nbGenerosity3, int nbGenerosity4, int nbGenerosity5) { // Liste des nbTrust List <int> nbTrust = new List <int> { nbTrust1, nbTrust2, nbTrust3, nbTrust4, nbTrust5 }; // Liste des nbGenerosity List <int> nbGenerosity = new List <int> { nbGenerosity1, nbGenerosity2, nbGenerosity3, nbGenerosity4, nbGenerosity5 }; for (int i = 0; i < nbCars; i++) { // La position initiale des voitures extérieures est toujours la position numéro 111 Vector3 spawnPosition = new Vector3(nodes[111].position.x, 0, nodes[111].position.z); Quaternion rotation = Quaternion.identity; rotation.eulerAngles = new Vector3(0, nodes[111].transform.eulerAngles.y, 0); GameObject newCar = Instantiate(car, spawnPosition, rotation); ExtCarController extCar = newCar.GetComponent <ExtCarController>(); extCar.Exit = nodes[numberExit]; extCar.Path = path; extCar.CameraView = cameraView; // TRUST // alea.Next(5) car la taille des listes Trust est de 5 // On vérifie que le nombre de la liste est différent de 0 int trust = alea.Next(5); while (nbTrust[trust] == 0) { trust = alea.Next(5); } // On associe le paramètre "Trust" à la voiture extCar.Trust = trust + 1; // On dés-incrémente les nombres dans la liste nbTrust[trust] -= 1; // GENEROSITY // alea.Next(5) car la taille des listes Generosity est de 5 // On vérifie que le nombre de la liste est différent de 0 int generosity = alea.Next(5); while (nbGenerosity[generosity] == 0) { generosity = alea.Next(5); } // On associe le paramètre "Generosity" à la voiture extCar.Generosity = generosity + 1; // On dés-incrémente le nombre dans la liste nbGenerosity[generosity] -= 1; listExtCars.Add(extCar); yield return(new WaitForSeconds(wait)); } }
/// <summary> /// Méthode appelée lorsque la voiture détecte une autre voiture arrivant en sens inverse /// </summary> /// <param name="hitCar">Voiture détéctée</param> private void DetectionMeeting(GameObject hitCar) { ExtCarController extCarHit = hitCar.gameObject.GetComponent <ExtCarController>(); IntCarController intCarHit = hitCar.gameObject.GetComponent <IntCarController>(); // Cas où la voiture est en mode aléatoire et n'a donc pas de position objectif if (aleaMode) { // Cas où la voiture est une voiture intérieure if (hitCar.tag == "IntCar") { isBraking = true; intCarHit.IsBraking = true; ReceivingInformation(intCarHit); } // Cas où la voiture est une voiture extérieure de même couleur else if (hitCar.tag == "ExtCar" && extCarHit.exit == this.exit) { isBraking = true; extCarHit.IsBraking = true; ReceivingInformation(extCarHit); } } // Cas où la voiture a une position objectif else { // Si la voiture n'est pas confiante et demande confirmation (ou pas ^^) de l'information if (alea.Next(1, 5) >= trust) { // Cas où la voiture est une voiture intérieure if (hitCar.tag == "IntCar") { isBraking = true; intCarHit.IsBraking = true; ReceivingInformation(intCarHit); } // Cas où la voiture est une voiture extérieure de même couleur else if (hitCar.tag == "ExtCar" && extCarHit.exit == this.exit) { isBraking = true; extCarHit.IsBraking = true; ReceivingInformation(extCarHit); } } } // La voiture est en train d'échanger de l'information endExchange = false; }
/// <summary> /// Méthode appelée lorsque la voiture reçoit de l'information d'une autre voiture (intérieure ou extérieure) /// </summary> /// <param name="car">Voiture captée pour échanger de l'information</param> private void ReceivingInformation(CarController car) { // Affichage de la flèche d'échange d'information DrawArrow(car); // Cas où la voiture avec qui on échange de l'information est une voiture extérieure if (car is ExtCarController) { ExtCarController extCar = (ExtCarController)car; // Si la voiture est assez généreuse pour partager de l'information (elle n'est donc pas en mode aléatoire) if (extCar.alea.Next(2, 6) <= extCar.Generosity && !extCar.aleaMode) { // ... alors la voiture prend la position objectif de la voiture croisée this.target = car.Target; // Échange réussi ! ^^ ==> Affichage de la checkmark canvasCheck.enabled = true; UpdateExchange(true, true, car); // Calcul du chemin le plus court pour atteindre sa position objectif FindingPath(); aleaMode = false; } else { // Échec de l'échange ! :'( ==> Affichage de la crossmark ==> Il ne se passe rien canvasCross.enabled = true; UpdateExchange(true, false, car); } } // Cas où la voiture avec qui on échange de l'information est une voiture intérieure if (car is IntCarController) { IntCarController intCar = (IntCarController)car; // Cas où la voiture intérieure croisée est sincère if (intCar.Sincerity) { bool extCarKnowsExit = false; // Vérification que la voiture intérieure croisée connaît la sortie de "notre" voiture foreach (Position exitKnown in intCar.ExitsKnown) { if (nodes[exitKnown.Number] == exit) { extCarKnowsExit = true; // La voiture prend la position objectif de la voiture croisée target = new Position(exitKnown.Number); // Échange réussi ! ^^ ==> Affichage de la checkmark canvasCheck.enabled = true; UpdateExchange(false, true, car); // Calcul du chemin le plus court pour atteindre sa position objectif FindingPath(); aleaMode = false; } } // Cas où la voiture intérieure croisée ne connaît pas la sortie de "notre" voiture if (!extCarKnowsExit) { // Échec de l'échange ! :'( ==> Affichage de la crossmark ==> Il ne se passe rien canvasCross.enabled = true; UpdateExchange(false, false, car); } } // Cas où la voiture intérieure croisée est malhonnête else { bool extCarGivesExit = false; // Vérification que la voiture intérieure croisée connaît au moins une sortie if (intCar.ExitsKnown.Count != 0) { // Cas où la voiture intérieure croisée ne connaît qu'une seule sortie if (intCar.ExitsKnown.Count == 1) { // Vérification que la sortie connue n'est pas celle de "notre" voiture if (nodes[intCar.ExitsKnown[0].Number] != exit) { extCarGivesExit = true; // La voiture prend la position objectif de la voiture croisée target = new Position(intCar.ExitsKnown[0].Number); // Échange réussi ! ^^ ==> Affichage de la checkmark canvasCheck.enabled = true; UpdateExchange(false, true, car); // Calcul du chemin le plus court pour atteindre sa position objectif FindingPath(); aleaMode = false; } } // Cas où la voiture intérieure croisée connaît plusieurs sorties else { // On en prend une aléatoirement qui ne soit pas celle de "notre" voiture int exitGiven = alea.Next(intCar.ExitsKnown.Count); while (nodes[intCar.ExitsKnown[exitGiven].Number] == exit) { exitGiven = alea.Next(intCar.ExitsKnown.Count); } extCarGivesExit = true; // La voiture prend la position objectif de la voiture croisée target = new Position(intCar.ExitsKnown[exitGiven].Number); // Échange réussi ! ^^ ==> Affichage de la checkmark canvasCheck.enabled = true; UpdateExchange(false, true, car); // Calcul du chemin le plus court pour atteindre sa position objectif FindingPath(); aleaMode = false; } } // Cas où la voiture intérieure croisée ne connaît pas de sorties // ou ne connaît que la sortie de "notre" voiture if (!extCarGivesExit) { // Échec de l'échange ! :'( ==> Affichage de la crossmark ==> Il ne se passe rien canvasCross.enabled = true; UpdateExchange(false, false, car); } } } }