[RESOLU] Forcer allumage feux de véhicules dans un tunnel

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

Re: Forcer allumage feux de véhicules dans un tunnel

Message par freepl » 22 Fév 2022 10:15

Donc pour la forme je fait un tunnel de forme simplifié et le rend trigger avec Maya 3d. Ok
Je comprends mieux pourquoi tu galères.
J'ai du mal à avoir les idées claires .

Pour le script d'où vient mon pb ?

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

Re: Forcer allumage feux de véhicules dans un tunnel

Message par boubouk50 » 22 Fév 2022 10:50

Difficile de te répondre pour le code, je n'ai pas tous les éléments, notamment comment est appelé GestionLumière (). Depuis l'Update ()? Dans ce cas, ce n'est pas bon, puisqu'à chaque frame, il va venir affecter l'éclairage.

Je pense qu'il te faut simplement comprendre qu'il y a plusieurs façons de concevoir un programme.
Il te faut comprendre l'événementiel, je pense. Il s'agit de n'agir seulement lorsque le besoin est là, à l'opposé du continu, via l'Update (), où tu gères continuellement les états.
Ainsi, tu réduis drastiquement les conflits lorsque deux objets veulent modifier la même variable.

Si tu passes par l'Update (), dans ce cas, il faut faire des conditions de détection de changement d'état. C'est à dire, qu'une variable ne sera affectée seulement si un changement d'état est repéré.
Voici un exemple de code :

Code : Tout sélectionner

// Définir une variable qui gardera en mémoire l'état en cours
bool etatLumiereCourant = false; //Ici, admettons que les lumières sont éteintes par défaut
...
void Update ()
{
	// CalculerNouvelEtatLumiere () va définir si les lumières doivent être éteintes ou allumées.
	// etatLumiereActuel va récupérer le résultat de ce calcul
	bool etatLumiereActuel = CalculerNouvelEtatLumiere ();
	
	// On compare l'état en cours et l'état actuel nouvellement calculé
	// S'ils sont identiques alors pas besoin de modifier quoique ce soit
	// Sinon on fait le changement
	if (etatLumiereActuel != etatLumiereCourant )
	{
		// On redéfinit l'état en cours
		etatLumiereCourant = etatLumiereActuel;
		// On affecte l'éclairage
		ChangerProprieteLumiere ();
	}
}
Ainsi, l'éclairage n'est affecté seulement si il y a eu un changement d'état. La variable d'éclairage n'est donc pas affectée en continue et peut donc être affectée par une autre source sans être écrasée à chaque fois. Cela permet de gérer plusieurs Components qui agissent sur la même variable.
C'est une solution pas très optimisée, mais c'est une solution.
Pour aller plus loin, il faudra comprendre le concept d'événement. Au lieu d'utiliser l'Update (), on utilise des événements déclencheurs tel OnTriggerEnter () par exemple. Cela permet de ne gérer une fonction seulement quand le besoin est là. C'est beaucoup plus simple à gérer et optimisé.
"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: Forcer allumage feux de véhicules dans un tunnel

Message par freepl » 22 Fév 2022 12:17

Pour le code, cela ne passe pas par update, ligne 291

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
 * 
 */
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 GameObject eclairageFreins;
	public GameObject clignotantsDroits;
	public GameObject clignotantsGauche;
	private IEnumerator coroutineClignotants;
	
	public InterieurVl interieur;

	// pour allumer eteindre les feux dans un tunnel Définir une variable qui gardera en mémoire l'état en cours
	bool etatLumiereCourant = false; //Ici, admettons que les lumières sont éteintes par défaut





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

	// pour allumer eteindre les feux dans un tunnel Définir une variable qui gardera en mémoire l'état en cours
	void Update ()
	{
		// CalculerNouvelEtatLumiere () va définir si les lumières doivent être éteintes ou allumées.
		// etatLumiereActuel va récupérer le résultat de ce calcul
		bool etatLumiereActuel = CalculerNouvelEtatLumiere ();
		
		// On compare l'état en cours et l'état actuel nouvellement calculé
		// S'ils sont identiques alors pas besoin de modifier quoique ce soit
		// Sinon on fait le changement
		if (etatLumiereActuel != etatLumiereCourant )
		{
			// On redéfinit l'état en cours
			etatLumiereCourant = etatLumiereActuel;
			// On affecte l'éclairage
			ChangerProprieteLumiere ();
		}
	}
	
	public void CalculerNouvelEtatLumiere(){
		//??????
	}


	public void ChangerProprieteLumiere(){
		if (eclairage.activeInHierarchy == false && jourNuit.intensity > 0.15f) {     // si jour les feux s'allument
			eclairage.SetActive (true);
		}
		if (eclairage.activeInHierarchy == false && jourNuit.intensity < 0.15f) {     // si nuit les feux restent allumés
			eclairage.SetActive (true);
		}

		/* ligne 291  
	    void GestionLumiere () {
		if (eclairage != null) {
			if (jourNuit.intensity < 0.15f) {
				if (eclairage.activeInHierarchy == false)
					eclairage.SetActive (true);
			}
			else {
				if (eclairage.activeInHierarchy == true)
					eclairage.SetActive (false);
			}
		}
	} */



	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 == "VEHICULE") 
			{
				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 
			{
				Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.08f); //0.05F
				direction.y = this.transform.position.y;
				transform.LookAt(direction);
			}
			
			if (gameObject.tag == "VELO") 
			{
				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 
			{
				Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.08f); //0.05F
				direction.y = this.transform.position.y;
				transform.LookAt(direction);
			}
			
			
			
			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 (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 s'il est devant

					if (other.tag == "VELO") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().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;
			
		}
	}
	
	void GestionLumiere () {
		if (eclairage != null) {
			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;
		}
	}
	
}
J'ai ajouté les lignes 36/37 et 76 à 121.
Je dois donc modifier ce code trajetvl Et faire un code de trigger.
Cela devient très dur à suivre (désolé)
pour cette partie je ne vois pas ce que je dois faire et comment

Code : Tout sélectionner

public void CalculerNouvelEtatLumiere(){
		//??????
	}
La solution ??!
Une idée basique.
Dans chaque véhicule, vélo j'ajoute un autre groupe de feux avant et arrière à chaque véhicule et je le mets éteint par défaut. Je l'appelle LumieresDansTunnel
ScreenShot088.jpg
ScreenShot088.jpg (45.45 Kio) Consulté 1830 fois
Et pour le code je fais un trigger enter, stay et exit qui affiche ce groupe et donc indépendant de la gestionLumière pour l'entrée du tunnel

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class AfficheFeuxVehiculeVelo : MonoBehaviour {

	// Faire une forme 3D du tunnel complet dans Maya3D
	private GameObject LesFeuxDuVehiculeDansTunnel ;         

	public void RechercheLumieresDansTunnel () {
		//cherche dans ces enfants un object avec le nom "LumieresDansTunnel"
		//si existe alors on ajoute l'object portant le nom "LumieresDansTunnel" dans la variable LesFeuxDuVehiculeDansTunnel
		if (this.transform.FindChild ("LumieresDansTunnel")) {
			LesFeuxDuVehiculeDansTunnel = this.transform.FindChild ("LumieresDansTunnel").gameObject;
		}


	}


	void OnTriggerEnter(Collider other) // le vehicule entre les feux copiés s'allument  ( indépendant de gestionLumière de trajetvl)
	{
		if (other.tag == "VEHICULE" || other.tag == "VELO") 
		{
			LesFeuxDuVehiculeDansTunnel.SetActive (true);
		}

	}

	void OnTriggerStay(Collider other)// le vehicule reste dans la forme 3D de Maya avec les feux copiés toujours allumés  ( indépendant de gestionLumière de trajetvl)
	{
		if (other.tag == "VEHICULE" || other.tag == "VELO") 
		{
			LesFeuxDuVehiculeDansTunnel.SetActive (true);
		}
		
	}

	void OnTriggerExit(Collider other) // le vehicule sort de la forme 3D de Maya ,  les feux copiés s'éteignent  ( indépendant de gestionLumière de trajetvl)
	{
		if (other.tag == "VEHICULE" || other.tag == "VELO") 
		{
			LesFeuxDuVehiculeDansTunnel.SetActive (false);
		}

	} 

}

Est ce que cela peut marcher et est ce que mon code trigger est bon ?

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

Re: Forcer allumage feux de véhicules dans un tunnel

Message par boubouk50 » 22 Fév 2022 13:44

Freepl,

c'est tellement un énorme bordel que je ne peux pas tout lire, tout comprendre et trouver ce qui ne va pas. Je ne peux pas passer tout mon temps sur ton projet, je travaille.
Ce que je peux faire c'est t'expliquer des concepts, te donner des idées, des pistes, etc. Mais derrière c'est à toi de le programmer.

GestionLumiere n'est effectivement pas dans l'Update, mais il est dans une boucle infinie qui opère exactement comme l'Update, donc en définitive, il est bien mis à jour en continu. Et c'est un souci puisqu'il écrase continuellement l'état actif de eclairage.

Code : Tout sélectionner

IEnumerator WalkThePath ()
{
	while(true)
	{
		... 
		GestionLumiere ();
		...
		yield return null;
	}
}
Ça, c'est exactement la même chose qu'un Update!

Du coup, comme dis précédemment, il va falloir le contraindre pour qu'il ne soit affecté seulement lors d'un changement d'état. Dans GestionLumiere , si tu changes l'état ailleurs, il va le remettre dans son état précédent.
C'est pour cela que je t'ai dit de tout regrouper au meme endroit.
Par exemple, le trigger pourrait uniquement donner l'information de savoir si tu es dans un tunnel ou non. Et GestionLumiere fera la tambouille en fonction de cela.

Code : Tout sélectionner

	private bool dansUnTunnel = false;

	void OnTriggerEnter(Collider other) // NE PAS COPIER LES FEUX, GARDER LES MEMES! ILS NE SONT PAS DIFFERENTS!
	{
		if (other.tag == "VEHICULE" || other.tag == "VELO") 
		{
			dansUnTunnel = true;
		}
	}
	
	void OnTriggerExit(Collider other) //SORTIE DU TUNNEL (UN SEUL COLLIDER ENTIER)
	{
		if (other.tag == "VEHICULE" || other.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);
				}
			}
		}
	}
Et voilà, c'est très simple. Tu fais déjà une réflexion étape par étape, il te manque pas grand chose dans le concept. Au lieu de vouloir faire quelque chose directement, de vouloir arriver à la solution, sors plutôt juste un résultat. Et c'est ce résultat que tu vas utiliser ailleurs avec d'autres résultats pour générer une solution qui tient compte de tout.
"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: Forcer allumage feux de véhicules dans un tunnel

Message par freepl » 22 Fév 2022 14:24

Un TRES grand merci pour ton soutien

J'ai compilé le script que j'ai mis sur un grand cube 3D trigger pour faire un test
Mais cela ne fonctionne pas, les feux ne s'allument pas
ScreenShot089.jpg
ScreenShot089.jpg (166.97 Kio) Consulté 1820 fois

Code : Tout sélectionner

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

public class TunnelAllumageDesFeux : MonoBehaviour {

	private bool dansUnTunnel = false;
	private GameObject eclairage;  
	private Light jourNuit;

	public void DemarageVl () {
		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;
		}
		

	}
		
		
	void OnTriggerEnter(Collider other) // NE PAS COPIER LES FEUX, GARDER LES MEMES! ILS NE SONT PAS DIFFERENTS!
	{
		if (other.tag == "VEHICULE" || other.tag == "VELO") 
		{
			dansUnTunnel = true;
		}
	}
	
	void OnTriggerExit(Collider other) //SORTIE DU TUNNEL (UN SEUL COLLIDER ENTIER)
	{
		if (other.tag == "VEHICULE" || other.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);
				}
			}
		}
	}
}

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

Re: Forcer allumage feux de véhicules dans un tunnel

Message par boubouk50 » 22 Fév 2022 15:31

Ce script est mis sur la voiture, je suppose (vu que tu vas faire un Find sur les enfants)
Dans ce cas, Collider other sera le tunnel pas le vélo ni le véhicule, il faut donc revoir la condition

Code : Tout sélectionner

void OnTriggerEnter (Collider other)
	{
		// Si le collider est 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")) 
Il faudra donc taguer le gameObject du tunnel en TUNNEL.
Aussi, on est d'accord que cette classe est la même qui gère déjà l'éclairage naturel, sinon tu vas avoir des redondances voire des conflits. GestionLumiere () ne doit pas être définie plusieurs fois.
Je t'ai donné un bout de code qui est sensé être dans ton gros script. GestionLumiere () est la même fonction que j'ai bricolé.
"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: Forcer allumage feux de véhicules dans un tunnel

Message par freepl » 22 Fév 2022 16:20

Je résume
Je fais un objet Maya 3D en forme de tunnel et je le taggue en TUNNEL
Je mets ce script sur tous les véhicules et les vélos
ScreenShot091.jpg
ScreenShot091.jpg (56.1 Kio) Consulté 1793 fois
J'ai changé GestionLumiere en AllumageExtinctionDesFeux , si j'ai bien compris qu'il ne fallait pas 2 fois le même nom

Code : Tout sélectionner

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

/* 

script à mettre sur tous les vehicules et les vélos
Pour allumer/éteindre dans  un tunnel , tous les feux des véhicules ou des velos faire un objet 3D de la forme du tunnel
et le tagguer en TUNNEL


 */


public class TunnelAllumageDesFeux : MonoBehaviour {

	private bool dansUnTunnel = false;
	private GameObject eclairage;  
	private Light jourNuit;

	public void DemarageVl () {
		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;
		}
		

	}

		
	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 AllumageExtinctionDesFeux() {
		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);
				}
			}
		}
	}
}
J'ai bien mis le code sur le velo de test mais eclairage est toujours non activé
Pièces jointes
ScreenShot090.jpg
ScreenShot090.jpg (195.54 Kio) Consulté 1793 fois

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

Re: Forcer allumage feux de véhicules dans un tunnel

Message par boubouk50 » 22 Fév 2022 16:40

Je pense que tu n'as toujours pas saisi. Et changer le nom ne sert strictement à rien.
Tu as 2 possibilités:
- Soit tu crées une nouvelle classe uniquement pour la gestion des feux.
Dans ce cas, tu supprimes le fonction GestionLumiere () et ses appels du script TrajetV1, qui ne doit donc plus rien gérer de l'éclairage des feux, et tu ajoutes (donc laisse) le script TunnelAllumageDesFeux (que tu pourras renommer AllumageDesFeux) puisqu'il gérera l'allumage des feux pour TOUTES les situations.

-Soit tu ne crées pas de nouvelle classe et tu continues dans TrajetV1.
Dans ce cas, tu reviens à TrajetV1 AVANT toute modification pour le tunnel, et tu ajoutes les fonctions OnTriggerEnter et Exit et tu modifies la fonction GestionLumière () avec ce que je t'ai donné.

Tu m'as fait exactement ce qu'il ne fallait pas: l'entre deux.
Du coup, tu gères l'éclairage des deux côtés de façon indépendante donc tu as toujours un conflit.
"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: Forcer allumage feux de véhicules dans un tunnel

Message par freepl » 22 Fév 2022 17:56

Donc pour finir , réalisation de la forme du tunnel sous maya 3D et tagué en TUNNEL
voici le script modifié ajout ligne 28 du "private bool dansUnTunnel = false;"

Modification des lignes 253 à 294

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
 * 
 */
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 == "VEHICULE") 
			{
				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 
			{
				Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.08f); //0.05F
				direction.y = this.transform.position.y;
				transform.LookAt(direction);
			}*/
			
			if (gameObject.tag == "VELO") 
			{
				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 
			{
				Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.08f); //0.05F
				direction.y = this.transform.position.y;
				transform.LookAt(direction);
			}*/
			if (gameObject.tag == "PIETON") 
			{
				Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.08f); //0.05F     pour que le pieton reste vertical
				direction.y = this.transform.position.y;
				transform.LookAt(direction);
			}
			/*else 
			{
				Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.08f); //0.05F
				direction.y = this.transform.position.y;
				transform.LookAt(direction);
			}*/
			
			
			
			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 (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 s'il est devant

					if (other.tag == "VELO") {
						coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
						kmhActuel = other.GetComponent<TrajetVl>().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;
		}
	}
	
}
en image
avant d'entrer,
ScreenShot093.jpg
ScreenShot093.jpg (83.1 Kio) Consulté 1767 fois
dedans : la voiture et le vélo ont leurs feux allumés
ScreenShot094.jpg
ScreenShot094.jpg (89.41 Kio) Consulté 1767 fois
sortie : la voiture sort ses feux sont éteints et le velo entre ses feux s'allument
ScreenShot095.jpg
ScreenShot095.jpg (101.65 Kio) Consulté 1767 fois

Merci pour ta patience boubouk50 , cela m'a permis de penser à autre chose pendant ces deux jours
:super: :super: :super: :super: :super: :super: :super: :super: :super: :super: :super: :super: :super:

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

Re: Forcer allumage feux de véhicules dans un tunnel

Message par boubouk50 » 22 Fév 2022 18:58

Pas de problème ;-)
"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

Répondre

Revenir vers « Scripting »