RESOLU [MY-AL] velo garde sa vitesse

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
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 » 15 Mars 2022 15:25

Bonjour
Dans cette partie de code, le vehicule qui suit un vélo se met à sa vitesse "instantanée"

Code : Tout sélectionner

/////// Pour que  vehicule se mette à la vitesse du velo qui est devant
					
					if (other.tag == "VELO") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
Mon problème vient que le code dit au vélo de faire de même. Le velo a un détecteur et si un véhicuel passe devant lui il prend sa vitesse instantanée, pas longtemps mais s'il touche un véhicule qui roule à 50 kmh à un croisement à angle droit, le velo va filer à 50 kmh sur 0.5 sec mais il le fait.

J'ai fait ça. En clair, si mon objet est un vélo et que son détecteur touche un véhicuel ou un bus , il doit garder sa propre vitesse.

Code : Tout sélectionner

/// Pour que le velo ne prenne pas la vitesse du véhicule à une intersection
					/// 
					if (gameObject.tag == "VELO" && other.tag == "VEHICULE"||other.tag == "BUS" ) {
						coupeDetecteur = GetComponent<TrajetVl>().detecteur;
						kmh = kmh;
					}
le code complet ( lignes 267)

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 vehicule qui est devant
					
					if (other.tag == "VEHICULE") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
					//////////////////////////
					
					/////// Pour que  vehicule se mette à la vitesse du bus qui est devant
					
					if (other.tag == "BUS") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
					//////////////////////////
					
					
					
					/////// Pour que  vehicule se mette à la vitesse du velo qui est devant
					
					if (other.tag == "VELO") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
					//////////////////////////
					 
					/// Pour que le velo ne prenne pas la vitesse du véhicule à une intersection
					/// 
					if (gameObject.tag == "VELO" && other.tag == "VEHICULE"||other.tag == "BUS" ) {
						coupeDetecteur = GetComponent<TrajetVl>().detecteur;
						kmh = kmh;
					}

					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 == "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;
		}
	}
	
}
Est-ce bon ?
Dernière édition par freepl le 21 Mars 2022 10:16, édité 1 fois.

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

Re: [MY-AL] velo garde sa vitesse

Message par boubouk50 » 15 Mars 2022 15:42

freepl a écrit :
15 Mars 2022 15:25
Est-ce bon ?
Est-ce que ça fonctionne?

Je t'ai déjà expliqué en quoi la logique conditionnelle de ton code est un frein. Tu ne peux plus faire autrement que détailler au cas par cas, ce que tu as fait. Donc c'est bon si ça fonctionne.
Maintenant, peut-être que ça peut être amélioré avec une condition inverse.
Au lieu de comparer avec un ==, tu peux comparer avec un != pour faire l'inverse.
Ainsi

Code : Tout sélectionner

if (gameObject.tag == "VELO" && other.tag == "VEHICULE"||other.tag == "BUS" ) {
qui signifiait: "si je suis un VELO et que je touche un VEHICULE ou un BUS alors"
pourrait devenir

Code : Tout sélectionner

if (gameObject.tag == "VELO" && other.tag != "VELO" ) {
qui signifierait: "si je suis un VELO et que je touche un non VELO alors" (autrement dit tout autre tag qui n'est pas VELO).

Si par contre le vélo ne prend JAMAIS la vitesse d'un autre, alors pourquoi s'embêter à faire un cas pour lui?

Tout ça pour dire, qu'au lieu de détailler tous les cas, tu peux ne détailler que les non-cas. Des fois, c'est plus clair et/ou plus rapide.
"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 » 15 Mars 2022 20:01

Pour m'amuser j'ai fait des clones toutes les 2 secondes. Et le pb du vélo est plus général en fait

Donc au cédez le passage ( quand il est validé c'est à dire un vl passe) ,on a des voitures à l'arrêt. La première a sa vitesse réelle (kmhActuel) à 0 km/h, donc la suivante idem, et le suivent idem etc..
avec ce code

Code : Tout sélectionner

					/////// Pour que  vehicule se mette à la vitesse du vehicule qui est devant
					
					if (other.tag == "VEHICULE") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
					//////////////////////////
					
					/////// Pour que  vehicule se mette à la vitesse du bus qui est devant
					
					if (other.tag == "BUS") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
					//////////////////////////
					
					
					
					/////// Pour que  vehicule se mette à la vitesse du velo qui est devant
					
					if (other.tag == "VELO") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
ScreenShot013.jpg
ScreenShot013.jpg (116.93 Kio) Consulté 1881 fois
Après que le vl soit passé , la première voiture à l'arrêt démarre. Comme la voiture suivante récupère sa vitesse réelle ( kmhActuel)et la suivante idem etc.. TOUTES les voitures repartent en même temps.
ScreenShot014.jpg
ScreenShot014.jpg (65.72 Kio) Consulté 1881 fois
Comment faire pour éviter cela ? Je pensais dire que si vitesse réelle devient égale à zéro alors kmh(vitesse voulue) = kmh, la voiture reprend sa vitesse .

Code : Tout sélectionner

					if (kmhActuel = 0) {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmh = GetComponent<TrajetVl>().kmh;
C'est bon ?

Voici le code d'origine où les engins tagués VEHICULE ne démarre pas tous en même temps (mais passent sur les autres engins tagués BUS et VELO) .
Comment faire de même pour des engins tagués BUS et VELO ? Le pb vient de là.

Code : Tout sélectionner

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 (var other in toucheDetecteur) {
					if (other.tag == "CoupeDetecteur") {
						coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
						kmhActuel = 50.0f;// pour degager les croisements
					}
					
					if (other.tag == "CoupeDetecteurAutre") {
						coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
						kmhActuel = 4.0f;
					}
					
					if (coupeDetecteur == false) {
						if (other.tag == "ModifVitesse") {
							kmh = other.GetComponent<Panneau>().vitesse;
							
							
						} else if (other.tag == "EntreeInstersection") {
							kmh = other.GetComponent<Priorite>().vitesse;
						} else if (other.tag == "VEHICULE") {
							
							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;
			
		}
	}

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

SOLUTION ? : [MY-AL] velo garde sa vitesse

Message par freepl » 16 Mars 2022 14:57

Bonjour

Comme mon pb de vélo n'est que sur un seul axe, je pense faire un cube trigger tagué PRENDREVITESSEVELO
Si un engin ,tag VEHICULE ou BUS le touche alors on récupère la vitesse réelle du véhicule devant lui

Code : Tout sélectionner

/////// Pour que  BUS se mette à la vitesse du bus devant
					
					if (other.tag == "BUS") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
					//////////////////////////		
			    	/////// Pour que  vehicule se mette à la vitesse du véhicule devant
					
					if (other.tag == "VEHICULE") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
					//////////////////////////							
					/////// Pour que  vehicule se mette à la vitesse du velo  devant 
					
					if (other.tag == "VELO") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;  //
					}
Je passe par le système Ontrigger du tunnel mais est ce que je peux faire 2 actions dans un seul onTrigger ?

Code : Tout sélectionner

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;
		}

		if (other.tag == "PRENDREVITESSEVELO" && (gameObject.tag == "VEHICULE" || gameObject.tag == "BUS")) 
		{
			coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
			kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; 
		}

	}
Ce code ne fonctionne pas , l'écriture est surement mauvaise , ou bien le raisonnement ?
Merci

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

Re: [MY-AL] velo garde sa vitesse

Message par boubouk50 » 17 Mars 2022 10:19

Si tu veux donner un délai, tu peux passer par Invoke (). Cela permettra de délayer l'action et de faire qu'une voiture ne démarre qu'après un petit temps d'attente.

Tu peux mettre tout ce que tu veux dans le OnTriggerXXX (). Par contre, tu ne peux pas mettre plusieurs OnTriggerXXX () dans une même classe.

Tu devrais plutôt gérer des états plutôt que de dupliquer les comportements. C'est à dire, savoir ce que font chaque utilisateur de la route. Par ex, si le vélo traverse la route, alors les véhicules qui s'arrêtent ne prennent pas sa vitesse, par contre s'il est sur la même voie, oui.
Définir des cas d'utilisation plutôt que des collisions. Ce sera plus lisible et moins contraignant, si jamais tu dois rajouter de nouveaux comportements à l'avenir.
"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 » 17 Mars 2022 14:05

Bonjour
Invoke lance un void mais dans mon cas ce qui doit être dans le void est déjà dans le void GestionDetecteur.
C'est une boucle sans fin.( ligne 253 à 276)

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;  //
					}
					//////////////////////////
					/// 
					/// /////// Pour que  vehicule se mette à la vitesse du velo qui est devant Pour maquette sous tunnel
					// Invoke, met un temps de retard au redémarrage, ici 0.3 sec des engins dans une file d'attente
					// sinon tous les engins repartent en meme temps
					if (other.tag == "VEHICULE") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; 
						Invoke (" ??"), 0.3f;//
					}
					/////////////////////////
					
					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;
		}
	}
	
}

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

Re: [MY-AL] velo garde sa vitesse

Message par boubouk50 » 17 Mars 2022 15:32

Oui, c'est vrai que tu ne peux pas utiliser de paramètres avec Invoke, et donc ça va pas le faire dans ton cas.
Dans ce cas, il te faut une coroutine à laquelle tu peux passer un argument (ce sera donc un tableau ou une structure).
Ceci est un exemple qui te montre comment le faire (fait à main levée, possibilité de fautes de frappe et autres)

Code : Tout sélectionner

struct DetecteurStructure
{
	float delai = 0f;
	bool detecteur;
	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;
}

... // Dans ta fonction GestionDetecteur
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 = 1.0f;
	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));
}
"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 10:18

Bonjour
Voici la modif que pour VEHICULE , après je ferai pour BUS et VELO

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
	float delai = 0f;
	struct DetecteurStructure
	{
	
		bool detecteur;
		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 = 1.0f;
						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;
		}
	}
	
}
Z056.jpg
Z056.jpg (50.29 Kio) Consulté 1734 fois

code erreur, si j'ai bien compris le flot delai ne doit pas être mis dans Struct

Code : Tout sélectionner

TrajetVl.cs(52,23): error CS0573: `TrajetVl.DetecteurStructure.delai': Structs cannot have instance field initializers
Mais si je le sors de Struct
Z055.jpg
Z055.jpg (40.27 Kio) Consulté 1736 fois
c'est cette erreur

Code : Tout sélectionner

TrajetVl.cs(282,61): error CS0122: `TrajetVl.DetecteurStructure.kmhActuel' is inaccessible due to its protection level

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
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:36

Non, le pb est que les variables sont privates. Passe les publiques pour y avoir accès.
"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 10:51

Les variables sont publiques et j'ai remis delai dans struct
Z057.jpg
Z057.jpg (24.6 Kio) Consulté 1727 fois
retour du même msg d'origine disant qu'il ne doit pas être là

Code : Tout sélectionner

`TrajetVl.DetecteurStructure.delai': Structs cannot have instance field initializers
Edit : Après recherche sur un site, il est dit de ne pas donner de valeur à delai
https://forum.unity.com/threads/problem ... ct.462993/

Du coup erreur dans la console mais au niveau du code général et aucun engin ne repart après le stop

Code : Tout sélectionner

ArgumentException: The thing you want to instantiate is null.
UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) (at C:/buildslave/unity/build/artifacts/EditorGenerated/UnityEngineObject.cs:104)
UnityEngine.Object.Instantiate (UnityEngine.Object original) (at C:/buildslave/unity/build/artifacts/EditorGenerated/UnityEngineObject.cs:90)
Z059.jpg
Z059.jpg (213.57 Kio) Consulté 1714 fois
Dernière édition par freepl le 18 Mars 2022 12:32, édité 2 fois.

Répondre

Revenir vers « Scripting »