[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

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

Message par freepl » 21 Fév 2022 13:19

Bonjour
Dans mon script principal, l'allumage des véhicules est lié à l'heure de la maquette , plutôt à l'intensité lumineuse.

Code : Tout sélectionner

...
public Light jourNuit;
public GameObject eclairage; 
...
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);
			}
		}
	}

	
La hiérarchie de mon véhicule est la suivante
ScreenShot082.jpg
ScreenShot082.jpg (50.59 Kio) Consulté 1857 fois
ScreenShot083.jpg
ScreenShot083.jpg (208.96 Kio) Consulté 1857 fois
Je voudrais faire un cube trigger en entrée de tunnel routier si un véhicule le touche ses feux s'allument ( et un autre trigger en sortie de tunnel routier pour qu'ils s'éteignent)
Mais je ne sais pas quelle variable prendre et bien le coder pour que SEULS les véhicules touchant ce trigger et donc étant sur la route dans le tunnel aient leurs feux d'allumer. Variable d'intensite de jourNuit ou bien simplement activer/désactiver la hiérarchie d'Eclairage ?
J'ai fait ce code qui ne fonctionne pas bien entendu car j'ai mis les 2 options que je crois possibles.

Code : Tout sélectionner

public class TunnelAllumageDesFeux : MonoBehaviour {

public GameObject AllumageFeuxVehiculesVeloDansTunnel;           

	
	void OnTriggerEnter(Collider other) { 
	
		if (other.tag == "VEHICULE") {
			AllumageFeuxVehiculesVeloDansTunnel = other.GetComponent<TrajetVl>().jourNuit; 
			AllumageFeuxVehiculesVeloDansTunnel == 0.14f;



			AllumageFeuxVehiculesVeloDansTunnel = other.GetComponent<TrajetVl>().eclairage.activeInHierarchy;
			AllumageFeuxVehiculesVeloDansTunnel.activeInHierarchy == false; // ??
			AllumageFeuxVehiculesVeloDansTunnel.SetActive (true);// ??



		}

	}
		
}
voici le code complet du trajet

Code : Tout sélectionner

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
// la fonction de trajet aérien est bloquée

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;
	public Light jourNuit;                    //private
	public GameObject eclairage;             //private

	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 (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;
		}
	}
	
}
Merci du coup de main
Dernière édition par freepl le 22 Fév 2022 19:14, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6246
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 » 21 Fév 2022 16:37

Je n'ai pas lu le code.

Il convient avant tout de savoir à qui l'interaction profite: Ici, la voiture qui entre/sort du tunnel.
Donc, le code doit être défini sur le véhicule et ne doit toucher que ses attributs.

Avec les Triggers, c'est exactement ce qu'il faut, puisque le OnTriggerEnter et OnTriggerStay puis OnTriggerExit feront office de gestion de l'éclairage des feux par véhicule.
OnTriggerEnter -> Pas obligatoire puisque le OnTriggerStay va gérer, mais si tu veux initialiser ou enregistrer quelque chose ce sera ici.
OnTriggerStay -> J'allume/laisse les feux allumés.
OnTriggerExit -> Les feux prennent l'état que l'heure lui demande (allumés si nuit, éteints si jour).

ATTENTION: la gestion de l'éclairage naturel peut être conflictuel avec le OnTriggerStay si ça a été programmé dans un Update plutôt qu'un événementiel. Dans ce cas, il faut sortir le code de l'éclairage naturel de l'Update et le gérer via événement.
"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 » 21 Fév 2022 16:50

bonjour
ATTENTION: la gestion de l'éclairage naturel peut être conflictuel avec le OnTriggerStay si ça a été programmé dans un Update plutôt qu'un événementiel. Dans ce cas, il faut sortir le code de l'éclairage naturel de l'Update et le gérer via événement.
C'est exactement ce que je voulais savoir. Du coup, l'option afficher/masquer le groupe eclairage de mes véhicules est peut-être le plus simple non ? Ou alors j'ai le conflit avec l'éclairage naturel ?
Donc, le code doit être défini sur le véhicule et ne doit toucher que ses attributs
le code doit être sur chaque véhicule ou bien sur un cube qui le sert de trigger? Je n'ai pas compris .

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 » 21 Fév 2022 17:25

J'ai fait ceci

Code : Tout sélectionner

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

public class TunnelAllumageDesFeux : MonoBehaviour {

	private GameObject LesFeuxDuVehicule;         

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

		if (LesFeuxDuVehicule.activeInHierarchy == false)
			LesFeuxDuVehicule.SetActive (true);
		}


	void OnTriggerStay(Collider other) { 
		if (other.tag == "VEHICULE" && LesFeuxDuVehicule.activeInHierarchy == false) {
			LesFeuxDuVehicule.SetActive (true);
		}
		if (other.tag == "VELO" && LesFeuxDuVehicule.activeInHierarchy == false) {
			LesFeuxDuVehicule.SetActive (true);
		}
		}

}
Quand un véhicule tag VEHICULE ou VELO touche le cube j'ai ce msg disant qu'il me manquez un objet, mais je ne vois pas lequel .

Code : Tout sélectionner

NullReferenceException: Object reference not set to an instance of an object
TunnelAllumageDesFeux.OnTriggerStay (UnityEngine.Collider other) (at Assets/SCRIPT/Route/TunnelAllumageDesFeux.cs:24)
La moto a bien son objet Eclairage en non affiché, j'ai le tag VEHICULE et j'ai le GameObject LesFeuxDuVehicule
ScreenShot085.jpg
ScreenShot085.jpg (79.78 Kio) Consulté 1808 fois
Dernière édition par freepl le 21 Fév 2022 18:13, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6246
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 » 21 Fév 2022 18:06

Tout ceci n'est qu'une question de structure de code.
Tu codes par fonctionnalité alors qu'il faudrait être beaucoup général pour éviter les redondances.
Par exemple, au lieu de coder un Component pour l'éclairage en fonction de la journée et un autre pour les tunnels, tu devrais coder un seul Component pour l'éclairage. Les deux font la même chose, pas besoin de les séparer. Ainsi, pas de problème de conflit ou de communication entre eux.
Il te faudrait donc un seul code qui réagit aux Triggers de tunnel ET à l'heure.
Pour l'heure, se pourrait être un simple événement (Event), pour les tunnels, les triggers.
Donc, le code doit être défini sur le véhicule
Quand même! Je l'ai écrit noir sur blanc :roll:
De toute façon, le OnTrigger ne réagira qu'avec le RigidBody de tes véhicules, donc tu ne pourras pas le mettre ailleurs. D'ailleurs, je ne vois même pas par quelle logique ça pourrait être autrement...
C'est exactement ce que je voulais savoir. Du coup, l'option afficher/masquer le groupe eclairage de mes véhicules est peut-être le plus simple non ? Ou alors j'ai le conflit avec l'éclairage naturel ?
Ben c'est ton code, je n'en sais rien! Je ne sais pas comment c'est géré, tu ne m'as mis que la fonction, pas son appel.
est-ce ok?
Ben ça allumera les lumières à l'entrée d'un tunnel. Rien d'autre. Ce n'est pas ce que j'ai écrit auparavant. Il manque le Exit pour remettre les lumières en fonction de l'heure -> Allumé si Nuit, Eteint si Jour.

Franchement, je m'épuise un peu. Je n'arrive pas à te comprendre, j'essaie de rester le plus simple et clair possible dans mes explications (enfin je crois) et pourtant ça a l'air ultra compliqué pour toi. J'ai l'impression que ça fait 10 ans que je répète les mêmes choses mais que rien n'est assimilé. Je ne sais plus comment faire. :triste1:
"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 » 21 Fév 2022 18:22

la fonction d'éclairage naturelle vient du programme Sky Dome
Elle est appelée ici par la variable jourNuit dans le seul code qui est sur tous les véhicules et vélos

Code : Tout sélectionner

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

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;
	public Light jourNuit;                    //private
	public GameObject eclairage;             //private

	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 (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;
		}
	}
	
}
Ben ça allumera les lumières à l'entrée d'un tunnel. Rien d'autre. Ce n'est pas ce que j'ai écrit auparavant. Il manque le Exit pour remettre les lumières en fonction de l'heure -> Allumé si Nuit, Eteint si Jour.
Je ne cherche qu'à faire cela. un cube avec stay pour allumer et un autre cube avec exit pour eteint si nuit
Merci pour ton mp

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6246
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 » 21 Fév 2022 18:46

freepl a écrit :
21 Fév 2022 18:22
Je ne cherche qu'à faire cela. un cube avec stay pour allumer et un autre cube avec exit pour eteint si nuit
Merci pour ton mp
HAAAAAAAANNNNNNN!!! Mais non!! (Tout s'éclaire d'un coup ;-) )
Pourquoi séparer? Il te faut un collider en Trigger d'un seul tenant qui gère aussi bien le fait d'entrer, de rester et de sortir.
Sinon, oui, c'est beaucoup plus galère puisque tu dois gérer toutes les conditions d'allumage/extinction des feux séparément.
"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 » 21 Fév 2022 19:24

Il te faut un collider en Trigger d'un seul tenant qui gère aussi bien le fait d'entrer, de rester et de sortir.
Je ne comprend pas "d'un seul tenant".
Il faut bien un objet trigger au début du tunnel et au autre au bout non ?

Voici où j'en suis.
J'ai pris en compte l'intensité lumineuse et les TAG

Code : Tout sélectionner

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

public class TunnelAllumageDesFeux : MonoBehaviour {

	private GameObject LesFeuxDuVehicule;         
	private Light jourNuit; 
	
	public void RechercheEclairage () {
		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 LesFeuxDuVehicule
		if (this.transform.FindChild ("Eclairage")) {
			LesFeuxDuVehicule = this.transform.FindChild ("Eclairage").gameObject;
		}

		if (LesFeuxDuVehicule.activeInHierarchy == false)
			LesFeuxDuVehicule.SetActive (true);
		}

	//--------------------------

	void OnTriggerEnter(Collider other) { 
		if (other.tag == "VEHICULE" && LesFeuxDuVehicule.activeInHierarchy == false && jourNuit.intensity > 0.15f) {     // si jour les feux s'allument
			LesFeuxDuVehicule.SetActive (true);
		}
		else{
			if (other.tag == "VEHICULE" && LesFeuxDuVehicule.activeInHierarchy == true && jourNuit.intensity < 0.15f  )   // si nuit les feux restent allumés
				LesFeuxDuVehicule.SetActive (true); 
			}


		if (other.tag == "VELO" && LesFeuxDuVehicule.activeInHierarchy == false && jourNuit.intensity > 0.15f) { // si jour les feux s'allument
			LesFeuxDuVehicule.SetActive (true);
		}else{
			if (other.tag == "VELO" && LesFeuxDuVehicule.activeInHierarchy == true && jourNuit.intensity < 0.15f)  // si nuit les feux restent allumés
						LesFeuxDuVehicule.SetActive (true); 
	         }
	}
	


	void OnTriggerStay(Collider other) { 
		if (other.tag == "VEHICULE" && LesFeuxDuVehicule.activeInHierarchy == false && jourNuit.intensity > 0.15f) {     // si jour les feux s'allument
			LesFeuxDuVehicule.SetActive (true);
		}
		else{
			if (other.tag == "VEHICULE" && LesFeuxDuVehicule.activeInHierarchy == true && jourNuit.intensity < 0.15f)   // si nuit les feux restent allumés
				LesFeuxDuVehicule.SetActive (true); 
		}
		
		
		if (other.tag == "VELO" && LesFeuxDuVehicule.activeInHierarchy == false && jourNuit.intensity > 0.15f) { // si jour les feux s'allument
			LesFeuxDuVehicule.SetActive (true);
		}else{
			if (other.tag == "VELO" && LesFeuxDuVehicule.activeInHierarchy == true && jourNuit.intensity < 0.15f)  // si nuit les feux restent allumés
				LesFeuxDuVehicule.SetActive (true); 
		}
		}




void OnTriggerExit(Collider other) {
		if (other.tag == "VEHICULE" && LesFeuxDuVehicule.activeInHierarchy == false && jourNuit.intensity > 0.15f) {     // si jour les feux s'éteignent
			LesFeuxDuVehicule.SetActive (false);
			}else{
			if (other.tag == "VEHICULE" && LesFeuxDuVehicule.activeInHierarchy == true && jourNuit.intensity < 0.15f)   // si nuit les feux restent allumés
			LesFeuxDuVehicule.SetActive (true); 
												
				if (other.tag == "VELO" && LesFeuxDuVehicule.activeInHierarchy == false && jourNuit.intensity > 0.15f) { // si jour les feux s'éteignent
			LesFeuxDuVehicule.SetActive (false);
			}else{
					if (other.tag == "VELO" && LesFeuxDuVehicule.activeInHierarchy == true && jourNuit.intensity < 0.15f) // si nuit les feux restent allumés
			LesFeuxDuVehicule.SetActive (true); 
		}
	}
	}
	/*     fonction d'origine de gestion des feux
	void AllumageExteinctionLumiere () {
		if (LesFeuxDuVehicule != null) {
			if (jourNuit.intensity < 0.15f) {
				if (LesFeuxDuVehicule.activeInHierarchy == false)
					LesFeuxDuVehicule.SetActive (true);
			}
			else {
				if (LesFeuxDuVehicule.activeInHierarchy == true)
					LesFeuxDuVehicule.SetActive (false);
			}
		}
	}
    */ 
}

J'ai cette erreur liée à l'intensité lumineuse je pense à jourNuit intensity

Code : Tout sélectionner

NullReferenceException: Object reference not set to an instance of an object
TunnelAllumageDesFeux.OnTriggerStay (UnityEngine.Collider other) (at Assets/SCRIPT/Route/TunnelAllumageDesFeux.cs:46)
A la ligne OnTrigger Stay

Code : Tout sélectionner

void OnTriggerStay(Collider other) { 
		if (other.tag == "VEHICULE" && LesFeuxDuVehicule.activeInHierarchy == false && jourNuit.intensity > 0.15f) {     // si jour les feux s'allument
			LesFeuxDuVehicule.SetActive (true);

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 09:33

Bonjour
J'ai essayé de faire par étape, tout simplement savoir si l'objet Eclairage est activé avec le Enter mais tjs le même code d'alerte surement lié à la variable LesFeuxDuVehicule

Code : Tout sélectionner

public class AfficheFeuxVehiculeVelo : MonoBehaviour {

	/// créer un objet Box Colider et Trigger coché, mesh renderer décoché 
	

	private GameObject LesFeuxDuVehicule;         

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


	}


	void OnTriggerEnter(Collider other)
	{
		if (other.tag == "VEHICULE" && LesFeuxDuVehicule.activeInHierarchy == false || other.tag == "VELO" && LesFeuxDuVehicule.activeInHierarchy == false) 
		{
			LesFeuxDuVehicule.SetActive (true);
		}

	}
}
J'ai aussi activé manuellement le groupe eclairage, mais le script l'a éteint ( surement celui lié à GestionLumière dans les cript de base TrajetVL

Code : Tout sélectionner

	
	private GameObject eclairage; 
	private Light jourNuit;
	
	jourNuit = GameObject.Find("Sky Dome").transform.FindChild("Light").GetComponent<Light>();
	
	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);
			}
		}
	}
Dans mon code j'avais changé "eclairage" par "LesFeuxDuVehicule" pour faire une différence.

Ps j'insiste lourdement ( surement pour certains) mais il faut que je m'occuper la tête pour des raisons personnelles.

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

freepl a écrit :
21 Fév 2022 19:24
Il te faut un collider en Trigger d'un seul tenant qui gère aussi bien le fait d'entrer, de rester et de sortir.
Je ne comprend pas "d'un seul tenant".
Il faut bien un objet trigger au début du tunnel et au autre au bout non ?
Ben non, justement, sinon le Stay n'aurait aucun intérêt.
Quand tu mets une boite elle devient la zone de Trigger. Tu entres dedans, tu es dedans, tu en sors. 3 étapes.
Du coup, c'est comme le tunnel, tu entres, tu es dedans, tu en sors. Simplissime!
Je comprends mieux pourquoi tu galères.
Aussi, les colliders ne sont pas forcément des cubes ou des cylindres primitifs d'Unity. Tu peux les modéliser et les importer dans Unity en tant que Mesh Collider, et donc définir sa forme comme tu l'entends.
"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 »