RESOLU [MY-AL] velo garde sa vitesse

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY-AL] velo garde sa vitesse

Message par boubouk50 » 18 Mars 2022 10:53

donne moi le code ou tu utilises delai stp
Et enlève le = 0f; je crois que c'est ça le pb. Tu ne peux pas initialiser une variable dans la structure.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL] velo garde sa vitesse

Message par freepl » 18 Mars 2022 13:34

Voici le code , j'ai mis maStructure.delai = 2f pour le test

Code : Tout sélectionner

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
// la fonction de trajet aérien est bloquée
/* Create by :
 * Fabian Métayer
 * 27/10/2015
 * 
 * Modifle 15-1-2019 pour véhicules et perso escalier
 * 
 * 
 * Modifier 04-03-2022 pour Tunnel 
 * 
 * AJOUTER AU 3° POINTS DE TOUS LES TRAJETS le cube de detecteur ON du PREFAB  Stop_Cédez le passage FOS
 * car quand on a mofidié  si vl touche le vl de devant il prend sa vitesse  
 * ça a mis à false coupeDetecteur donc les vehicules ne reçoivent plus de consigne 
 * ça bug pour les clignotants et la camera aérienne regardait dans son dos
 * 
 * si 2 vl se croisent sur la MEME trajectoire mais en sens inverse cela désactive le détecteur
 * donc il faudra mettre APRES le croisement le cube de detecteur ON du PREFAB  Stop_Cédez le passage FOS
 * 
 * 
 */
public class TrajetVl : MonoBehaviour {
	public GameObject target_Path;
	public float kmh; // vitesse voulue
	public float kmhActuel; // vitesse reelle
	public float mEntrePoint = 5.0f;
	private float time;
	public float fraction;
	public Transform[] tabtList = new Transform[11];
	public int minTab = 0;
	public Transform detecteur;
	public LayerMask layerPanneau;
	public Collider[] toucheDetecteur;
	public bool coupeDetecteur;
	private Light jourNuit;                    //private
	private GameObject eclairage;             //private
	private bool dansUnTunnel = false;       // pour allumage des feux dans un tunnel, le tunnel est tagué en TUNNEL et a la forme 3D du tunnel réel
	
	private GameObject eclairageFreins;
	public GameObject clignotantsDroits;
	public GameObject clignotantsGauche;
	private IEnumerator coroutineClignotants;
	
	public InterieurVl interieur;
	
	// quand l'engin touche un autre , il prend sa vitesse actuelle, mais s'ils sont tous à un stop, ils repartent TOUS ensembles

	struct DetecteurStructure
	{
	public	float delai ;
	public	bool detecteur;
	public	float kmhActuel;
	}
	
	private IEnumerator GestionDetecteurCoroutine (DetecteurStructure _maStructure)
	{
		// Attendre le délai choisi
		yield return new WaitForSeconds (_maStructure.delai);
		// Affecter les données
		coupeDetecteur = _maStructure.detecteur;
		kmhActuel = _maStructure.kmhActuel;
	}
	/// /// 
	
	public void DemrageVl () {
		tabtList = new Transform[11];
		
		TabDynamique ();
		if (transform.FindChild("Detecteur"))
			detecteur = transform.FindChild("Detecteur").transform;
		
		jourNuit = GameObject.Find("Sky Dome").transform.FindChild("Light").GetComponent<Light>();
		
		//cherche dans ces enfants un object avec le nom Eclairage
		//si existe alors on ajoute l'object portant le nom "Eclairage" dans la variable eclairage
		if (this.transform.FindChild ("Eclairage")) {
			eclairage = this.transform.FindChild ("Eclairage").gameObject;
		}
		
		if (this.transform.FindChild ("Eclairage_Freins")) {
			eclairageFreins = this.transform.FindChild ("Eclairage_Freins").gameObject;
			eclairageFreins.SetActive (false);
		}
		
		if (this.transform.FindChild ("Eclairage_Clignotants_droits")) {
			clignotantsDroits = this.transform.FindChild ("Eclairage_Clignotants_droits").gameObject;
			clignotantsDroits.SetActive (false);
		}
		
		if (this.transform.FindChild ("Eclairage_Clignotants_gauche")) {
			clignotantsGauche = this.transform.FindChild ("Eclairage_Clignotants_gauche").gameObject;
			clignotantsGauche.SetActive (false);
		}
		
		StartCoroutine("WalkThePath");
	}
	
	public void TabDynamique () {
		fraction = 0.1f;
		int count = 0;
		
		for (int i = 0; i < 11; i++) {
			if (minTab+i < target_Path.transform.childCount) {
				tabtList[i] = target_Path.transform.GetChild(minTab+i);
				count++;
			}
		}
		
		if (minTab+8 < target_Path.transform.childCount)
			minTab += 8;
		else
			minTab += count;
	}
	
	public void StopCoroutine () {
		StopCoroutine("WalkThePath");
	}
	
	
	/*
    // version du createur DOTWEENN
    void LateUpdate () {
        //nombre de point * distance entre point / km/h / 3.6
        time = (tabt.Length * mEntrePoint)/(kmh / 3.6f);
        if (start) {			
            transform.position = iTween.PointOnPath(tabt, fraction);
			
            fraction += Time.deltaTime / time;
            if (fraction > 1.0f)
                fraction = 0.0f;
			
            transform.LookAt(iTween.PointOnPath(tabt, fraction + 0.001f));
         }
    }*/
	
	IEnumerator WalkThePath () {
		while(true){
			time = ((tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f)*0.88f);//   original (tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f)   
			/*
			scene 2x2
			362 x 5m = 1 810m 
				130 kmh/h fait 36.1111 mn/s        donc   1 810m à 130km/h  fait  50 sec / 55 sec réelles donc x0.91 pour avoir 50 sec
				110 kmh/h fait 30.5555 mn/s        donc   1 810m à 110km/h  fait  59 sec / 64 sec réelles donc x0.91 pour avoir 59 sec


             scene bi-di
             305 x 5m = 1 525m 
				90 kmh/h fait 25     mn/s        donc   1 525m à 90km/h  fait  61 sec /  66 sec réelles donc x0.91 pour avoir 60 sec
				50 kmh/h fait 13.888 mn/s        donc   1 525m à 50km/h  fait  110 sec/ 117 sec réelles donc x0.91 pour avoir 107 sec

			 */
			
			
			
			transform.position = iTween.PointOnPath (tabtList, fraction);
			fraction += Time.deltaTime / time;
			if (fraction > 1.0f)
				fraction = 0.0f;
			
			/* modif pour vehicule ou personnage*/
			
			
			if (gameObject.tag == "VELO" || gameObject.tag == "VEHICULE" || gameObject.tag == "BUS"/*Et tous les autres comme MOTO, CAMION, etc*/) 
			{
				transform.LookAt(iTween.PointOnPath(tabtList, fraction + 0.08f)); //0.05F  plus c'est petit est plus de tremblote pour s'orienter sur le point à 0.005m
			}
			
			
			else //c'est les pietons, qui restent verticaux, ou la camera aérienne qui n'a pas besoin de suivre la pente du terrain 
			{
				Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.08f); //0.05F
				direction.y = this.transform.position.y;
				transform.LookAt(direction);
			}
			
			// Accélération , freinage
			
			/*
			Oui.
			Tu peux voir ça comme une interpolation linéaire si tu veux.
			En multipliant une valeur par deltaTime, tu t'assures qu'elle vaudra sa valeur complète au bout d'une seconde.
			Ex:x = x + 7 * deltaTime;
			x vaudra 7 lorsque la somme des deltaTimes vaudra 1. Tu fais donc du "7 par seconde" quelque soit le taux de rafraîchissement de la fenêtre.
			Ainsi, si tu veux que ta voiture prenne 15 kmh en une seconde, il te faut remplacer 0.7 par 15.
		Si tu veux qu'elle freine de 20 kmh en une seconde, il te faut remplacer 0.9 par 20.
			 */ 
			
			
			/*if (kmhActuel < kmh){
				kmhActuel += 0.7f;// acceleration jusqu'à la vitesse kmh 0.7f
			} else if (kmhActuel > kmh && kmh != 0) {
				kmhActuel -= 0.9f;// decceleration douce 0.9
			} else if (kmh == 0) {
				kmhActuel = 0;// on stoppe brutalement le VL
			}*/
			
			if (kmhActuel < kmh){
				kmhActuel = kmhActuel + 100f*Time.deltaTime;// // acceleration de la vitesse de 100kmh par seconde
			} else if (kmhActuel > kmh && kmh != 0) {
				kmhActuel = kmhActuel - 50f*Time.deltaTime;// // decceleration de la vitesse de 50kmh par seconde
			} else if (kmh == 0) {
				kmhActuel = 0;// on stoppe brutalement le VL
			}
			
			/*
			// Mettre la condition forte en premier
			if (kmh == 0)
			{
				kmhActuel = 0;// on stoppe brutalement le VL
			}
			else if (kmhActuel < kmh) //
			{
				// En utilisant un minimum tu bornes ta vitesse entre la vitesse en cours et la vitesse à prendre (kmh)
				kmhActuel = Mathf.Min (kmhActuel + 30*Time.deltaTime, kmh);
				// acceleration de la vitesse de 30 km/h par seconde
			} else if (kmhActuel > kmh)
			{
				// En utilisant un maximum, tu bornes ta vitesse entre la vitesse en cours et la vitesse à prendre (kmh)
				kmhActuel = Mathf.Max (kmhActuel - 50f*Time.deltaTime, kmh);
				// decceleration de la vitesse de 50kmh par seconde
			}
*/
			
			
			
			if (fraction >= 0.9f) //0.9f
				TabDynamique();
			
			GestionDetecteur ();
			GestionLumiere ();
			GestionFreins ();
			
			yield return null;
		}
	}
	
	
	
	
	
	void GestionDetecteur () {
		if (detecteur != null) {
			if (gameObject.tag == "VEHICULE")
				toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.75f, layerPanneau);
			else
				toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.5f, layerPanneau);
			
			if (toucheDetecteur.Length != 0) {
				foreach (Collider other in toucheDetecteur) {
					if (other.tag == "CoupeDetecteur") {
						coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
						kmhActuel = 30.0f;// pour degager les croisements  à 30 km/h 
						// tant que la sphere du détecteur est dans l'objet sa vitesse est de 30 km/h
						// apres le VL reprend sa vitesse normale
					}
					
					if (other.tag == "CoupeDetecteurAutre") {
						coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
						kmhActuel = 4.0f; 
					}
					
					
					/////// Pour que  vehicule se mette à la vitesse du velo qui est devant Pour maquette sous tunnel
					
					if (other.tag == "VELO") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
					//////////////////////////
					/////// Pour que  vehicule se mette à la vitesse du VEHICUEL qui est devant Pour maquette sous tunnel
					
					if (other.tag == "VEHICULE") {
						//coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						//kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; 
						// Créer une nouvelle DetecteurStructure
						DetecteurStructure maStructure = new DetecteurStructure ();
						// Affecter ses champs -> Delai, detecteur et kmhActuel
						maStructure.delai = 2f;
						maStructure.detecteur = other.GetComponent<TrajetVl>().detecteur;
						maStructure.kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; 
						// Appeler la coroutine avec la structure créée en paramètre
						StartCoroutine (GestionDetecteurCoroutine (maStructure));  //
					}
					//////////////////////////
					/// 
					/// 
					/// 
					
					if (coupeDetecteur == false) {
						if (other.tag == "ModifVitesse") {
							kmh = other.GetComponent<Panneau>().vitesse;
							
							
						} else if (other.tag == "EntreeInstersection") {
							kmh = GetPrioriteVitesse(other);
						} else if (other.tag == "VEHICULE") {
							
							if (kmh > other.GetComponent<TrajetVl>().kmh)
								kmh = other.GetComponent<TrajetVl>().kmh;
						}//***************
						else if (other.tag == "BUS") {
							
							if (kmh > other.GetComponent<TrajetVl>().kmh)
								kmh = other.GetComponent<TrajetVl>().kmh;
						} //***************
						
						
						
						
						else if (other.tag == "ClignotantsOn") {
							kmh = other.GetComponent<GestionClignotants>().vitesse;
							if (other.GetComponent<GestionClignotants>().trajet == target_Path) {
								ClignotantsOff ();
								if (other.GetComponent<GestionClignotants>().enumClignotants == EnumClignotants.Droites) {
									coroutineClignotants = ClignotantsDroits();
									StartCoroutine (coroutineClignotants);
								} else {
									coroutineClignotants = ClignotantsGauche();
									StartCoroutine (coroutineClignotants);
								}
							}
						} else if (other.tag == "ClignotantsOff") {
							kmh = other.GetComponent<GestionClignotants>().vitesse;
							ClignotantsOff ();
						}
					}
				}
			}
			
			if (kmhActuel == 0 && toucheDetecteur.Length == 0)
				kmhActuel = 30.0f;
			
		}
	}
	//------------------------------------------------------------------------------------
	//                allumage et extinction des feux dans un tunnel
	
	void OnTriggerEnter(Collider other) //ENTREE DU TUNNEL 
		//le collider MAYA 3D en forme de tunnel doit etre tagué TUNNEL et que ce script est attaché a un objet tagué VEHICULE ou VELO
	{                               
		if (other.tag == "TUNNEL" && (gameObject.tag == "VEHICULE" || gameObject.tag == "VELO")) 
		{
			dansUnTunnel = true;
		}
	}
	
	void OnTriggerExit(Collider other) //SORTIE DU TUNNEL (UN SEUL COLLIDER ENTIER MAYA 3D en forme de tunnel)
	{
		if (other.tag == "TUNNEL" && (gameObject.tag == "VEHICULE" || gameObject.tag == "VELO"))
		{
			dansUnTunnel = false;
		}
	}
	
	
	// ------------------------------
	void GestionLumiere () {
		if (eclairage != null)
		{
			// SI TU ES DANS UN TUNNEL TU ALLUMES LES FEUX QUEL QUE SOIT LE JOUR/NUIT
			if (dansUnTunnel) {
				eclairage.SetActive (true);
			}
			// SINON C'EST LE JOUR/NUIT QUI S'EN OCCUPE
			else {
				if (jourNuit.intensity < 0.15f) {
					if (eclairage.activeInHierarchy == false)
						eclairage.SetActive (true);
				}
				else {
					if (eclairage.activeInHierarchy == true)
						eclairage.SetActive (false);
				}
			}
		}
	}
	
	void GestionFreins () {
		if (eclairageFreins != null){
			if (kmhActuel > kmh+3 || kmhActuel == 0) {
				if (eclairageFreins.activeInHierarchy == false)
					eclairageFreins.SetActive (true);
			} else {
				if (eclairageFreins.activeInHierarchy == true)
					eclairageFreins.SetActive (false);
			}
		}
	}
	
	IEnumerator ClignotantsDroits () {
		if (clignotantsDroits != null) {
			while (true) {
				clignotantsDroits.SetActive (true);
				yield return new WaitForSeconds (0.3f);
				clignotantsDroits.SetActive (false);
				yield return new WaitForSeconds (0.3f);
			}
		}
	}
	
	IEnumerator ClignotantsGauche () {
		if (clignotantsGauche != null) {
			while (true) {
				clignotantsGauche.SetActive (true);
				yield return new WaitForSeconds (0.3f);
				clignotantsGauche.SetActive (false);
				yield return new WaitForSeconds (0.3f);
			}
		}
	}
	
	void ClignotantsOff () {
		if (coroutineClignotants != null) {
			StopCoroutine (coroutineClignotants);
			
			if (clignotantsDroits != null)
				clignotantsDroits.SetActive (false);
			if (clignotantsGauche != null)
				clignotantsGauche.SetActive (false);
			
			coroutineClignotants = null;
		}
	}
	
	float GetPrioriteVitesse(Collider other){
		Priorite priorite = other.GetComponent<Priorite> ();
		if (priorite != null) {
			return priorite.vitesse;
		} else {
			PrioriteOllioules prioriteOllioules = other.GetComponent<PrioriteOllioules> ();
			return prioriteOllioules.vitesse;
		}
	}
	
}
Ici au départ, le grand carré est la zone de détection. Je la bloque comme si il y avait un engin, du coup j'obtiens un bouchon au stop
Z060.jpg
Z060.jpg (268.65 Kio) Consulté 1325 fois
Je dis qu'il n'y a plus d'engin, et donc la voiture bleue peut passer
Z061.jpg
Z061.jpg (262.89 Kio) Consulté 1325 fois
Le premier engin va au stop ( le camion), les autres le suivent en avançant un peu.
Mais après que l'on ait ou que l'on n'ait pas d'engin dans la zone de détection, le camion ne bouge plus
Z062.jpg
Z062.jpg (155.21 Kio) Consulté 1325 fois
j'ai testé avec 0.1f, même comportement. Le premier engin s'arrete au stop. Après son départ du stop, le suivant s'arrete au stop mais ne repart plus, kmh et kmActuel à zéro

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY-AL] velo garde sa vitesse

Message par boubouk50 » 18 Mars 2022 15:25

Je ne vais pas non plus revoir et faire tout ton algo.

Il faut voir la logique que ça suit. Qui touche quoi (ou ne touche plus) et s'il n'y a pas une question d'ordre.
Par ex, ton véhicule qui repart, s'il n'est plus touché, alors le véhicule derrière ne va plus prendre sa vitesse. Est-il capable de repartir tout seul si rien ne l'empêche?
Il faut réfléchir pour un seul véhicule. Quel est son comportement dans tous les cas. Ensuite, ce comportement apporté à chaque véhicule sera effectif s'il a été entièrement réfléchi.
Donc je te dirai de lister toutes les conditions possibles (chef de file, croisement, derrière un véhicule, etc)
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL] velo garde sa vitesse

Message par freepl » 18 Mars 2022 16:26

le 1er engin arrive
Detecteur touche le tag ModifVitesse qui change kmh de TrajetVl

le 2 ieme engin arrive
detecteur touche tag VEHICULE et prend sa vitesee actuelle kmhActuelle.

le 3 ieme engin arrive
idem
-----------
le premier repart
2 sec aprés le 2 idem mais à 30 kmh suite à ceci

Code : Tout sélectionner

if (kmhActuel == 0 && toucheDetecteur.Length == 0)
				kmhActuel = 30.0f;
ensuite il touche le tag ModifVitesse et là il est bloqué.
Donc , il faut mettre aussi que si sa vitesse actuelle est nulle et que toucheDetecteur est non nul il doit récupérer sa vitesse (de création ?)

Code : Tout sélectionner

if (kmhActuel == 0 && toucheDetecteur.Length > 0)
				kmhActuel = ????;
Z064.jpg
Z064.jpg (415.27 Kio) Consulté 1303 fois

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY-AL] velo garde sa vitesse

Message par boubouk50 » 18 Mars 2022 16:37

Je ne sais pas freepl, c'est ton programme.
Ce n'est pas à moi de te dire quoi faire et comment. Il y a trop de questionnements pour que je puisse savoir quoi répondre.
Ce n'est plus un pb de compétences ici mais d'organisation de ton code et je me suis déjà exprimé 20 fois sur le sujet. Tu as tellement de conditions que ça devient problématique quand tu veux ajouter une fonctionnalité parce qu'elle rentre en conflit avec les autres. C'est pour ça que je te dis de tout lister et de faire les liens entre toutes les fonctionnalités pour savoir où tu en es et où des conflits peuvent arriver.
Mais ça, ce n'est pas à moi ni à personne d'autre de te le faire ou de te le dire. C'est ton programme. Tu as décidé de faire une architecture conditionnelle, tu dois t'organiser pour la mener à bien.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

RESOLU : [MY-AL] velo garde sa vitesse

Message par freepl » 19 Mars 2022 20:34

Bojour

Pb résolu. J'ai fait comme tu l'as dit, j'ai regardé image par image le comportement des engins.
J'ai repris le code initial sans Struct et modifier ceci dans GestionDetecteur

Code : Tout sélectionner

if (other.tag == "VEHICULE") {
if (kmhActuel > other.GetComponent<TrajetVl>().kmhActuel) // si je rattrape VEHICULE devant 
// et ma vitesse Actuelle plus rapide
kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; // je prends sa vitesse Actuelle
}
maintenant, les engins prennent la vitesse de celui de devant.
Et dans un embouteillage, ils ne repartent pas tous en même temps.

Code : Tout sélectionner

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
// la fonction de trajet aérien est bloquée
/* Create by :
 * Fabian Métayer
 * 27/10/2015
 * 
 * Modifle 15-1-2019 pour véhicules et perso escalier
 * 
 * 
 * Modifier 04-03-2022 pour Tunnel 
 * 
 * AJOUTER AU 3° POINTS DE TOUS LES TRAJETS le cube de detecteur ON du PREFAB  Stop_Cédez le passage FOS
 * car quand on a mofidié  si vl touche le vl de devant il prend sa vitesse  
 * ça a mis à false coupeDetecteur donc les vehicules ne reçoivent plus de consigne 
 * ça bug pour les clignotants et la camera aérienne regardait dans son dos
 * 
 * si 2 vl se croisent sur la MEME trajectoire mais en sens inverse cela désactive le détecteur
 * donc il faudra mettre APRES le croisement le cube de detecteur ON du PREFAB  Stop_Cédez le passage FOS
 * 
 * 
 */
public class TrajetVl : MonoBehaviour {
	public GameObject target_Path;
	public float kmh; // vitesse voulue
	public float kmhActuel; // vitesse reelle
	public float mEntrePoint = 5.0f;
	private float time;
	public float fraction;
	public Transform[] tabtList = new Transform[11];
	public int minTab = 0;
	public Transform detecteur;
	public LayerMask layerPanneau;
	public Collider[] toucheDetecteur;
	public bool coupeDetecteur;
	private Light jourNuit;                    //private
	private GameObject eclairage;             //private
	private bool dansUnTunnel = false;       // pour allumage des feux dans un tunnel, le tunnel est tagué en TUNNEL et a la forme 3D du tunnel réel
	
	private GameObject eclairageFreins;
	public GameObject clignotantsDroits;
	public GameObject clignotantsGauche;
	private IEnumerator coroutineClignotants;
	
	public InterieurVl interieur;
	
	public void DemrageVl () {
		tabtList = new Transform[11];
		TabDynamique ();
		if (transform.FindChild("Detecteur"))
			detecteur = transform.FindChild("Detecteur").transform;
		
		jourNuit = GameObject.Find("Sky Dome").transform.FindChild("Light").GetComponent<Light>();
		
		//cherche dans ces enfants un object avec le nom Eclairage
		//si existe alors on ajoute l'object portant le nom "Eclairage" dans la variable eclairage
		if (this.transform.FindChild ("Eclairage")) {
			eclairage = this.transform.FindChild ("Eclairage").gameObject;
		}
		
		if (this.transform.FindChild ("Eclairage_Freins")) {
			eclairageFreins = this.transform.FindChild ("Eclairage_Freins").gameObject;
			eclairageFreins.SetActive (false);
		}
		
		if (this.transform.FindChild ("Eclairage_Clignotants_droits")) {
			clignotantsDroits = this.transform.FindChild ("Eclairage_Clignotants_droits").gameObject;
			clignotantsDroits.SetActive (false);
		}
		
		if (this.transform.FindChild ("Eclairage_Clignotants_gauche")) {
			clignotantsGauche = this.transform.FindChild ("Eclairage_Clignotants_gauche").gameObject;
			clignotantsGauche.SetActive (false);
		}
		
		StartCoroutine("WalkThePath");
	}
	
	public void TabDynamique () {
		fraction = 0.1f;
		int count = 0;
		
		for (int i = 0; i < 11; i++) {
			if (minTab+i < target_Path.transform.childCount) {
				tabtList[i] = target_Path.transform.GetChild(minTab+i);
				count++;
			}
		}
		
		if (minTab+8 < target_Path.transform.childCount)
			minTab += 8;
		else
			minTab += count;
	}
	
	public void StopCoroutine () {
		StopCoroutine("WalkThePath");
	}
	
	
	/*
    // version du createur DOTWEENN
    void LateUpdate () {
        //nombre de point * distance entre point / km/h / 3.6
        time = (tabt.Length * mEntrePoint)/(kmh / 3.6f);
        if (start) {			
            transform.position = iTween.PointOnPath(tabt, fraction);
			
            fraction += Time.deltaTime / time;
            if (fraction > 1.0f)
                fraction = 0.0f;
			
            transform.LookAt(iTween.PointOnPath(tabt, fraction + 0.001f));
         }
    }*/
	
	IEnumerator WalkThePath () {
		while(true){
			time = ((tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f)*0.88f);//   original (tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f)   
			/*
			scene 2x2
			362 x 5m = 1 810m 
				130 kmh/h fait 36.1111 mn/s        donc   1 810m à 130km/h  fait  50 sec / 55 sec réelles donc x0.91 pour avoir 50 sec
				110 kmh/h fait 30.5555 mn/s        donc   1 810m à 110km/h  fait  59 sec / 64 sec réelles donc x0.91 pour avoir 59 sec


             scene bi-di
             305 x 5m = 1 525m 
				90 kmh/h fait 25     mn/s        donc   1 525m à 90km/h  fait  61 sec /  66 sec réelles donc x0.91 pour avoir 60 sec
				50 kmh/h fait 13.888 mn/s        donc   1 525m à 50km/h  fait  110 sec/ 117 sec réelles donc x0.91 pour avoir 107 sec

			 */
			
			
			
			transform.position = iTween.PointOnPath (tabtList, fraction);
			fraction += Time.deltaTime / time;
			if (fraction > 1.0f)
				fraction = 0.0f;
			
			/* modif pour vehicule ou personnage*/
			
			
			if (gameObject.tag == "VELO" || gameObject.tag == "VEHICULE" || gameObject.tag == "BUS"/*Et tous les autres comme MOTO, CAMION, etc*/) 
			{
				transform.LookAt(iTween.PointOnPath(tabtList, fraction + 0.08f)); //0.05F  plus c'est petit est plus de tremblote pour s'orienter sur le point à 0.005m
			}
			
			
			else //c'est les pietons, qui restent verticaux, ou la camera aérienne qui n'a pas besoin de suivre la pente du terrain 
			{
				Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.08f); //0.05F
				direction.y = this.transform.position.y;
				transform.LookAt(direction);
			}
			
			// Accélération , freinage

			/*
			Oui.
			Tu peux voir ça comme une interpolation linéaire si tu veux.
			En multipliant une valeur par deltaTime, tu t'assures qu'elle vaudra sa valeur complète au bout d'une seconde.
			Ex:x = x + 7 * deltaTime;
			x vaudra 7 lorsque la somme des deltaTimes vaudra 1. Tu fais donc du "7 par seconde" quelque soit le taux de rafraîchissement de la fenêtre.
			Ainsi, si tu veux que ta voiture prenne 15 kmh en une seconde, il te faut remplacer 0.7 par 15.
		Si tu veux qu'elle freine de 20 kmh en une seconde, il te faut remplacer 0.9 par 20.
			 */ 

			
			/*if (kmhActuel < kmh){
				kmhActuel += 0.7f;// acceleration jusqu'à la vitesse kmh 0.7f
			} else if (kmhActuel > kmh && kmh != 0) {
				kmhActuel -= 0.9f;// decceleration douce 0.9
			} else if (kmh == 0) {
				kmhActuel = 0;// on stoppe brutalement le VL
			}*/

			if (kmhActuel < kmh){
				kmhActuel = kmhActuel + 100f*Time.deltaTime;// // acceleration de la vitesse de 100kmh par seconde
			} else if (kmhActuel > kmh && kmh != 0) {
				kmhActuel = kmhActuel - 50f*Time.deltaTime;// // decceleration de la vitesse de 50kmh par seconde
			} else if (kmh == 0) {
				kmhActuel = 0;// on stoppe brutalement le VL
			}

			/*
			// Mettre la condition forte en premier
			if (kmh == 0)
			{
				kmhActuel = 0;// on stoppe brutalement le VL
			}
			else if (kmhActuel < kmh) //
			{
				// En utilisant un minimum tu bornes ta vitesse entre la vitesse en cours et la vitesse à prendre (kmh)
				kmhActuel = Mathf.Min (kmhActuel + 30*Time.deltaTime, kmh);
				// acceleration de la vitesse de 30 km/h par seconde
			} else if (kmhActuel > kmh)
			{
				// En utilisant un maximum, tu bornes ta vitesse entre la vitesse en cours et la vitesse à prendre (kmh)
				kmhActuel = Mathf.Max (kmhActuel - 50f*Time.deltaTime, kmh);
				// decceleration de la vitesse de 50kmh par seconde
			}
*/


			
			if (fraction >= 0.9f) //0.9f
				TabDynamique();
			
			GestionDetecteur ();
			GestionLumiere ();
			GestionFreins ();
			
			yield return null;
		}
	}
	
	void GestionDetecteur () {
		if (detecteur != null) {
			if (gameObject.tag == "VEHICULE")
				toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.75f, layerPanneau);
			else
				toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.5f, layerPanneau);
			
			if (toucheDetecteur.Length != 0) {
				foreach (Collider other in toucheDetecteur) {
					if (other.tag == "CoupeDetecteur") {
						coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
						kmhActuel = 30.0f;// pour degager les croisements  à 30 km/h 
						// tant que la sphere du détecteur est dans l'objet sa vitesse est de 30 km/h
						// apres le VL reprend sa vitesse normale
					}
					
					if (other.tag == "CoupeDetecteurAutre") {
						coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
						kmhActuel = 4.0f; 
					}
					
										
					/////// Pour que  vehicule se mette à la vitesse du velo qui est devant Pour maquette sous tunnel
					
					if (other.tag == "VELO") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
					//////////////////////////
					
					if (coupeDetecteur == false) {
						if (other.tag == "ModifVitesse") {
							kmh = other.GetComponent<Panneau>().vitesse;
							
							
						} else if (other.tag == "EntreeInstersection") {
							kmh = GetPrioriteVitesse(other);
						} else if (other.tag == "VEHICULE") {
							

							if (kmhActuel > other.GetComponent<TrajetVl>().kmhActuel) // si je rattrape VEHICULE devant 
								                                                      // et ma vitesse Actuelle plus rapide
								kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; // je prends sa vitesse Actuelle


						}//***************
						else if (other.tag == "BUS") {
							

							if (kmhActuel > other.GetComponent<TrajetVl>().kmhActuel) // si je rattrape VEHICULE devant 
								                                                      // et ma vitesse Actuelle plus rapide
								kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; // je prends sa vitesse Actuelle
						} //***************




						else if (other.tag == "ClignotantsOn") {
							kmh = other.GetComponent<GestionClignotants>().vitesse;
							if (other.GetComponent<GestionClignotants>().trajet == target_Path) {
								ClignotantsOff ();
								if (other.GetComponent<GestionClignotants>().enumClignotants == EnumClignotants.Droites) {
									coroutineClignotants = ClignotantsDroits();
									StartCoroutine (coroutineClignotants);
								} else {
									coroutineClignotants = ClignotantsGauche();
									StartCoroutine (coroutineClignotants);
								}
							}
						} else if (other.tag == "ClignotantsOff") {
							kmh = other.GetComponent<GestionClignotants>().vitesse;
							ClignotantsOff ();
						}
					}
				}
			}
			
			if (kmhActuel == 0 && toucheDetecteur.Length == 0)
				kmhActuel = 30.0f;


		
		}
	}
	//------------------------------------------------------------------------------------
	//                allumage et extinction des feux dans un tunnel
	
	void OnTriggerEnter(Collider other) //ENTREE DU TUNNEL 
		//le collider MAYA 3D en forme de tunnel doit etre tagué TUNNEL et que ce script est attaché a un objet tagué VEHICULE ou VELO
	{                               
		if (other.tag == "TUNNEL" && (gameObject.tag == "VEHICULE" || gameObject.tag == "VELO")) 
		{
			dansUnTunnel = true;
		}
	}
	
	void OnTriggerExit(Collider other) //SORTIE DU TUNNEL (UN SEUL COLLIDER ENTIER MAYA 3D en forme de tunnel)
	{
		if (other.tag == "TUNNEL" && (gameObject.tag == "VEHICULE" || gameObject.tag == "VELO"))
		{
			dansUnTunnel = false;
		}
	}
	
	
	// ------------------------------
	void GestionLumiere () {
		if (eclairage != null)
		{
			// SI TU ES DANS UN TUNNEL TU ALLUMES LES FEUX QUEL QUE SOIT LE JOUR/NUIT
			if (dansUnTunnel) {
				eclairage.SetActive (true);
			}
			// SINON C'EST LE JOUR/NUIT QUI S'EN OCCUPE
			else {
				if (jourNuit.intensity < 0.15f) {
					if (eclairage.activeInHierarchy == false)
						eclairage.SetActive (true);
				}
				else {
					if (eclairage.activeInHierarchy == true)
						eclairage.SetActive (false);
				}
			}
		}
	}
	
	void GestionFreins () {
		if (eclairageFreins != null){
			if (kmhActuel > kmh+3 || kmhActuel == 0) {
				if (eclairageFreins.activeInHierarchy == false)
					eclairageFreins.SetActive (true);
			} else {
				if (eclairageFreins.activeInHierarchy == true)
					eclairageFreins.SetActive (false);
			}
		}
	}
	
	IEnumerator ClignotantsDroits () {
		if (clignotantsDroits != null) {
			while (true) {
				clignotantsDroits.SetActive (true);
				yield return new WaitForSeconds (0.3f);
				clignotantsDroits.SetActive (false);
				yield return new WaitForSeconds (0.3f);
			}
		}
	}
	
	IEnumerator ClignotantsGauche () {
		if (clignotantsGauche != null) {
			while (true) {
				clignotantsGauche.SetActive (true);
				yield return new WaitForSeconds (0.3f);
				clignotantsGauche.SetActive (false);
				yield return new WaitForSeconds (0.3f);
			}
		}
	}
	
	void ClignotantsOff () {
		if (coroutineClignotants != null) {
			StopCoroutine (coroutineClignotants);
			
			if (clignotantsDroits != null)
				clignotantsDroits.SetActive (false);
			if (clignotantsGauche != null)
				clignotantsGauche.SetActive (false);
			
			coroutineClignotants = null;
		}
	}
	
	float GetPrioriteVitesse(Collider other){
		Priorite priorite = other.GetComponent<Priorite> ();
		if (priorite != null) {
			return priorite.vitesse;
		} else {
			PrioriteOllioules prioriteOllioules = other.GetComponent<PrioriteOllioules> ();
			return prioriteOllioules.vitesse;
		}
	}
	
}
ScreenShot019.jpg
ScreenShot019.jpg (113.78 Kio) Consulté 1238 fois
Merci :super:

Répondre

Revenir vers « Scripting »