donne moi le code ou tu utilises delai stp
Et enlève le = 0f; je crois que c'est ça le pb. Tu ne peux pas initialiser une variable dans la structure.
RESOLU [MY-AL] velo garde sa vitesse
- boubouk50
- ModoGenereux
- Messages : 6235
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [MY-AL] velo garde sa vitesse
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [MY-AL] velo garde sa vitesse
Voici le code , j'ai mis maStructure.delai = 2f pour le test
Ici au départ, le grand carré est la zone de détection. Je la bloque comme si il y avait un engin, du coup j'obtiens un bouchon au stop
Je dis qu'il n'y a plus d'engin, et donc la voiture bleue peut passer
Le premier engin va au stop ( le camion), les autres le suivent en avançant un peu.
Mais après que l'on ait ou que l'on n'ait pas d'engin dans la zone de détection, le camion ne bouge plus j'ai testé avec 0.1f, même comportement. Le premier engin s'arrete au stop. Après son départ du stop, le suivant s'arrete au stop mais ne repart plus, kmh et kmActuel à zéro
Code : Tout sélectionner
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
// la fonction de trajet aérien est bloquée
/* Create by :
* Fabian Métayer
* 27/10/2015
*
* Modifle 15-1-2019 pour véhicules et perso escalier
*
*
* Modifier 04-03-2022 pour Tunnel
*
* AJOUTER AU 3° POINTS DE TOUS LES TRAJETS le cube de detecteur ON du PREFAB Stop_Cédez le passage FOS
* car quand on a mofidié si vl touche le vl de devant il prend sa vitesse
* ça a mis à false coupeDetecteur donc les vehicules ne reçoivent plus de consigne
* ça bug pour les clignotants et la camera aérienne regardait dans son dos
*
* si 2 vl se croisent sur la MEME trajectoire mais en sens inverse cela désactive le détecteur
* donc il faudra mettre APRES le croisement le cube de detecteur ON du PREFAB Stop_Cédez le passage FOS
*
*
*/
public class TrajetVl : MonoBehaviour {
public GameObject target_Path;
public float kmh; // vitesse voulue
public float kmhActuel; // vitesse reelle
public float mEntrePoint = 5.0f;
private float time;
public float fraction;
public Transform[] tabtList = new Transform[11];
public int minTab = 0;
public Transform detecteur;
public LayerMask layerPanneau;
public Collider[] toucheDetecteur;
public bool coupeDetecteur;
private Light jourNuit; //private
private GameObject eclairage; //private
private bool dansUnTunnel = false; // pour allumage des feux dans un tunnel, le tunnel est tagué en TUNNEL et a la forme 3D du tunnel réel
private GameObject eclairageFreins;
public GameObject clignotantsDroits;
public GameObject clignotantsGauche;
private IEnumerator coroutineClignotants;
public InterieurVl interieur;
// quand l'engin touche un autre , il prend sa vitesse actuelle, mais s'ils sont tous à un stop, ils repartent TOUS ensembles
struct DetecteurStructure
{
public float delai ;
public bool detecteur;
public float kmhActuel;
}
private IEnumerator GestionDetecteurCoroutine (DetecteurStructure _maStructure)
{
// Attendre le délai choisi
yield return new WaitForSeconds (_maStructure.delai);
// Affecter les données
coupeDetecteur = _maStructure.detecteur;
kmhActuel = _maStructure.kmhActuel;
}
/// ///
public void DemrageVl () {
tabtList = new Transform[11];
TabDynamique ();
if (transform.FindChild("Detecteur"))
detecteur = transform.FindChild("Detecteur").transform;
jourNuit = GameObject.Find("Sky Dome").transform.FindChild("Light").GetComponent<Light>();
//cherche dans ces enfants un object avec le nom Eclairage
//si existe alors on ajoute l'object portant le nom "Eclairage" dans la variable eclairage
if (this.transform.FindChild ("Eclairage")) {
eclairage = this.transform.FindChild ("Eclairage").gameObject;
}
if (this.transform.FindChild ("Eclairage_Freins")) {
eclairageFreins = this.transform.FindChild ("Eclairage_Freins").gameObject;
eclairageFreins.SetActive (false);
}
if (this.transform.FindChild ("Eclairage_Clignotants_droits")) {
clignotantsDroits = this.transform.FindChild ("Eclairage_Clignotants_droits").gameObject;
clignotantsDroits.SetActive (false);
}
if (this.transform.FindChild ("Eclairage_Clignotants_gauche")) {
clignotantsGauche = this.transform.FindChild ("Eclairage_Clignotants_gauche").gameObject;
clignotantsGauche.SetActive (false);
}
StartCoroutine("WalkThePath");
}
public void TabDynamique () {
fraction = 0.1f;
int count = 0;
for (int i = 0; i < 11; i++) {
if (minTab+i < target_Path.transform.childCount) {
tabtList[i] = target_Path.transform.GetChild(minTab+i);
count++;
}
}
if (minTab+8 < target_Path.transform.childCount)
minTab += 8;
else
minTab += count;
}
public void StopCoroutine () {
StopCoroutine("WalkThePath");
}
/*
// version du createur DOTWEENN
void LateUpdate () {
//nombre de point * distance entre point / km/h / 3.6
time = (tabt.Length * mEntrePoint)/(kmh / 3.6f);
if (start) {
transform.position = iTween.PointOnPath(tabt, fraction);
fraction += Time.deltaTime / time;
if (fraction > 1.0f)
fraction = 0.0f;
transform.LookAt(iTween.PointOnPath(tabt, fraction + 0.001f));
}
}*/
IEnumerator WalkThePath () {
while(true){
time = ((tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f)*0.88f);// original (tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f)
/*
scene 2x2
362 x 5m = 1 810m
130 kmh/h fait 36.1111 mn/s donc 1 810m à 130km/h fait 50 sec / 55 sec réelles donc x0.91 pour avoir 50 sec
110 kmh/h fait 30.5555 mn/s donc 1 810m à 110km/h fait 59 sec / 64 sec réelles donc x0.91 pour avoir 59 sec
scene bi-di
305 x 5m = 1 525m
90 kmh/h fait 25 mn/s donc 1 525m à 90km/h fait 61 sec / 66 sec réelles donc x0.91 pour avoir 60 sec
50 kmh/h fait 13.888 mn/s donc 1 525m à 50km/h fait 110 sec/ 117 sec réelles donc x0.91 pour avoir 107 sec
*/
transform.position = iTween.PointOnPath (tabtList, fraction);
fraction += Time.deltaTime / time;
if (fraction > 1.0f)
fraction = 0.0f;
/* modif pour vehicule ou personnage*/
if (gameObject.tag == "VELO" || gameObject.tag == "VEHICULE" || gameObject.tag == "BUS"/*Et tous les autres comme MOTO, CAMION, etc*/)
{
transform.LookAt(iTween.PointOnPath(tabtList, fraction + 0.08f)); //0.05F plus c'est petit est plus de tremblote pour s'orienter sur le point à 0.005m
}
else //c'est les pietons, qui restent verticaux, ou la camera aérienne qui n'a pas besoin de suivre la pente du terrain
{
Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.08f); //0.05F
direction.y = this.transform.position.y;
transform.LookAt(direction);
}
// Accélération , freinage
/*
Oui.
Tu peux voir ça comme une interpolation linéaire si tu veux.
En multipliant une valeur par deltaTime, tu t'assures qu'elle vaudra sa valeur complète au bout d'une seconde.
Ex:x = x + 7 * deltaTime;
x vaudra 7 lorsque la somme des deltaTimes vaudra 1. Tu fais donc du "7 par seconde" quelque soit le taux de rafraîchissement de la fenêtre.
Ainsi, si tu veux que ta voiture prenne 15 kmh en une seconde, il te faut remplacer 0.7 par 15.
Si tu veux qu'elle freine de 20 kmh en une seconde, il te faut remplacer 0.9 par 20.
*/
/*if (kmhActuel < kmh){
kmhActuel += 0.7f;// acceleration jusqu'à la vitesse kmh 0.7f
} else if (kmhActuel > kmh && kmh != 0) {
kmhActuel -= 0.9f;// decceleration douce 0.9
} else if (kmh == 0) {
kmhActuel = 0;// on stoppe brutalement le VL
}*/
if (kmhActuel < kmh){
kmhActuel = kmhActuel + 100f*Time.deltaTime;// // acceleration de la vitesse de 100kmh par seconde
} else if (kmhActuel > kmh && kmh != 0) {
kmhActuel = kmhActuel - 50f*Time.deltaTime;// // decceleration de la vitesse de 50kmh par seconde
} else if (kmh == 0) {
kmhActuel = 0;// on stoppe brutalement le VL
}
/*
// Mettre la condition forte en premier
if (kmh == 0)
{
kmhActuel = 0;// on stoppe brutalement le VL
}
else if (kmhActuel < kmh) //
{
// En utilisant un minimum tu bornes ta vitesse entre la vitesse en cours et la vitesse à prendre (kmh)
kmhActuel = Mathf.Min (kmhActuel + 30*Time.deltaTime, kmh);
// acceleration de la vitesse de 30 km/h par seconde
} else if (kmhActuel > kmh)
{
// En utilisant un maximum, tu bornes ta vitesse entre la vitesse en cours et la vitesse à prendre (kmh)
kmhActuel = Mathf.Max (kmhActuel - 50f*Time.deltaTime, kmh);
// decceleration de la vitesse de 50kmh par seconde
}
*/
if (fraction >= 0.9f) //0.9f
TabDynamique();
GestionDetecteur ();
GestionLumiere ();
GestionFreins ();
yield return null;
}
}
void GestionDetecteur () {
if (detecteur != null) {
if (gameObject.tag == "VEHICULE")
toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.75f, layerPanneau);
else
toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.5f, layerPanneau);
if (toucheDetecteur.Length != 0) {
foreach (Collider other in toucheDetecteur) {
if (other.tag == "CoupeDetecteur") {
coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
kmhActuel = 30.0f;// pour degager les croisements à 30 km/h
// tant que la sphere du détecteur est dans l'objet sa vitesse est de 30 km/h
// apres le VL reprend sa vitesse normale
}
if (other.tag == "CoupeDetecteurAutre") {
coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
kmhActuel = 4.0f;
}
/////// Pour que vehicule se mette à la vitesse du velo qui est devant Pour maquette sous tunnel
if (other.tag == "VELO") {
coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; //
}
//////////////////////////
/////// Pour que vehicule se mette à la vitesse du VEHICUEL qui est devant Pour maquette sous tunnel
if (other.tag == "VEHICULE") {
//coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
//kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;
// Créer une nouvelle DetecteurStructure
DetecteurStructure maStructure = new DetecteurStructure ();
// Affecter ses champs -> Delai, detecteur et kmhActuel
maStructure.delai = 2f;
maStructure.detecteur = other.GetComponent<TrajetVl>().detecteur;
maStructure.kmhActuel = other.GetComponent<TrajetVl>().kmhActuel;
// Appeler la coroutine avec la structure créée en paramètre
StartCoroutine (GestionDetecteurCoroutine (maStructure)); //
}
//////////////////////////
///
///
///
if (coupeDetecteur == false) {
if (other.tag == "ModifVitesse") {
kmh = other.GetComponent<Panneau>().vitesse;
} else if (other.tag == "EntreeInstersection") {
kmh = GetPrioriteVitesse(other);
} else if (other.tag == "VEHICULE") {
if (kmh > other.GetComponent<TrajetVl>().kmh)
kmh = other.GetComponent<TrajetVl>().kmh;
}//***************
else if (other.tag == "BUS") {
if (kmh > other.GetComponent<TrajetVl>().kmh)
kmh = other.GetComponent<TrajetVl>().kmh;
} //***************
else if (other.tag == "ClignotantsOn") {
kmh = other.GetComponent<GestionClignotants>().vitesse;
if (other.GetComponent<GestionClignotants>().trajet == target_Path) {
ClignotantsOff ();
if (other.GetComponent<GestionClignotants>().enumClignotants == EnumClignotants.Droites) {
coroutineClignotants = ClignotantsDroits();
StartCoroutine (coroutineClignotants);
} else {
coroutineClignotants = ClignotantsGauche();
StartCoroutine (coroutineClignotants);
}
}
} else if (other.tag == "ClignotantsOff") {
kmh = other.GetComponent<GestionClignotants>().vitesse;
ClignotantsOff ();
}
}
}
}
if (kmhActuel == 0 && toucheDetecteur.Length == 0)
kmhActuel = 30.0f;
}
}
//------------------------------------------------------------------------------------
// allumage et extinction des feux dans un tunnel
void OnTriggerEnter(Collider other) //ENTREE DU TUNNEL
//le collider MAYA 3D en forme de tunnel doit etre tagué TUNNEL et que ce script est attaché a un objet tagué VEHICULE ou VELO
{
if (other.tag == "TUNNEL" && (gameObject.tag == "VEHICULE" || gameObject.tag == "VELO"))
{
dansUnTunnel = true;
}
}
void OnTriggerExit(Collider other) //SORTIE DU TUNNEL (UN SEUL COLLIDER ENTIER MAYA 3D en forme de tunnel)
{
if (other.tag == "TUNNEL" && (gameObject.tag == "VEHICULE" || gameObject.tag == "VELO"))
{
dansUnTunnel = false;
}
}
// ------------------------------
void GestionLumiere () {
if (eclairage != null)
{
// SI TU ES DANS UN TUNNEL TU ALLUMES LES FEUX QUEL QUE SOIT LE JOUR/NUIT
if (dansUnTunnel) {
eclairage.SetActive (true);
}
// SINON C'EST LE JOUR/NUIT QUI S'EN OCCUPE
else {
if (jourNuit.intensity < 0.15f) {
if (eclairage.activeInHierarchy == false)
eclairage.SetActive (true);
}
else {
if (eclairage.activeInHierarchy == true)
eclairage.SetActive (false);
}
}
}
}
void GestionFreins () {
if (eclairageFreins != null){
if (kmhActuel > kmh+3 || kmhActuel == 0) {
if (eclairageFreins.activeInHierarchy == false)
eclairageFreins.SetActive (true);
} else {
if (eclairageFreins.activeInHierarchy == true)
eclairageFreins.SetActive (false);
}
}
}
IEnumerator ClignotantsDroits () {
if (clignotantsDroits != null) {
while (true) {
clignotantsDroits.SetActive (true);
yield return new WaitForSeconds (0.3f);
clignotantsDroits.SetActive (false);
yield return new WaitForSeconds (0.3f);
}
}
}
IEnumerator ClignotantsGauche () {
if (clignotantsGauche != null) {
while (true) {
clignotantsGauche.SetActive (true);
yield return new WaitForSeconds (0.3f);
clignotantsGauche.SetActive (false);
yield return new WaitForSeconds (0.3f);
}
}
}
void ClignotantsOff () {
if (coroutineClignotants != null) {
StopCoroutine (coroutineClignotants);
if (clignotantsDroits != null)
clignotantsDroits.SetActive (false);
if (clignotantsGauche != null)
clignotantsGauche.SetActive (false);
coroutineClignotants = null;
}
}
float GetPrioriteVitesse(Collider other){
Priorite priorite = other.GetComponent<Priorite> ();
if (priorite != null) {
return priorite.vitesse;
} else {
PrioriteOllioules prioriteOllioules = other.GetComponent<PrioriteOllioules> ();
return prioriteOllioules.vitesse;
}
}
}
Mais après que l'on ait ou que l'on n'ait pas d'engin dans la zone de détection, le camion ne bouge plus j'ai testé avec 0.1f, même comportement. Le premier engin s'arrete au stop. Après son départ du stop, le suivant s'arrete au stop mais ne repart plus, kmh et kmActuel à zéro
- boubouk50
- ModoGenereux
- Messages : 6235
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [MY-AL] velo garde sa vitesse
Je ne vais pas non plus revoir et faire tout ton algo.
Il faut voir la logique que ça suit. Qui touche quoi (ou ne touche plus) et s'il n'y a pas une question d'ordre.
Par ex, ton véhicule qui repart, s'il n'est plus touché, alors le véhicule derrière ne va plus prendre sa vitesse. Est-il capable de repartir tout seul si rien ne l'empêche?
Il faut réfléchir pour un seul véhicule. Quel est son comportement dans tous les cas. Ensuite, ce comportement apporté à chaque véhicule sera effectif s'il a été entièrement réfléchi.
Donc je te dirai de lister toutes les conditions possibles (chef de file, croisement, derrière un véhicule, etc)
Il faut voir la logique que ça suit. Qui touche quoi (ou ne touche plus) et s'il n'y a pas une question d'ordre.
Par ex, ton véhicule qui repart, s'il n'est plus touché, alors le véhicule derrière ne va plus prendre sa vitesse. Est-il capable de repartir tout seul si rien ne l'empêche?
Il faut réfléchir pour un seul véhicule. Quel est son comportement dans tous les cas. Ensuite, ce comportement apporté à chaque véhicule sera effectif s'il a été entièrement réfléchi.
Donc je te dirai de lister toutes les conditions possibles (chef de file, croisement, derrière un véhicule, etc)
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [MY-AL] velo garde sa vitesse
le 1er engin arrive
Detecteur touche le tag ModifVitesse qui change kmh de TrajetVl
le 2 ieme engin arrive
detecteur touche tag VEHICULE et prend sa vitesee actuelle kmhActuelle.
le 3 ieme engin arrive
idem
-----------
le premier repart
2 sec aprés le 2 idem mais à 30 kmh suite à ceci
ensuite il touche le tag ModifVitesse et là il est bloqué.
Donc , il faut mettre aussi que si sa vitesse actuelle est nulle et que toucheDetecteur est non nul il doit récupérer sa vitesse (de création ?)
Detecteur touche le tag ModifVitesse qui change kmh de TrajetVl
le 2 ieme engin arrive
detecteur touche tag VEHICULE et prend sa vitesee actuelle kmhActuelle.
le 3 ieme engin arrive
idem
-----------
le premier repart
2 sec aprés le 2 idem mais à 30 kmh suite à ceci
Code : Tout sélectionner
if (kmhActuel == 0 && toucheDetecteur.Length == 0)
kmhActuel = 30.0f;
Donc , il faut mettre aussi que si sa vitesse actuelle est nulle et que toucheDetecteur est non nul il doit récupérer sa vitesse (de création ?)
Code : Tout sélectionner
if (kmhActuel == 0 && toucheDetecteur.Length > 0)
kmhActuel = ????;
- boubouk50
- ModoGenereux
- Messages : 6235
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [MY-AL] velo garde sa vitesse
Je ne sais pas freepl, c'est ton programme.
Ce n'est pas à moi de te dire quoi faire et comment. Il y a trop de questionnements pour que je puisse savoir quoi répondre.
Ce n'est plus un pb de compétences ici mais d'organisation de ton code et je me suis déjà exprimé 20 fois sur le sujet. Tu as tellement de conditions que ça devient problématique quand tu veux ajouter une fonctionnalité parce qu'elle rentre en conflit avec les autres. C'est pour ça que je te dis de tout lister et de faire les liens entre toutes les fonctionnalités pour savoir où tu en es et où des conflits peuvent arriver.
Mais ça, ce n'est pas à moi ni à personne d'autre de te le faire ou de te le dire. C'est ton programme. Tu as décidé de faire une architecture conditionnelle, tu dois t'organiser pour la mener à bien.
Ce n'est pas à moi de te dire quoi faire et comment. Il y a trop de questionnements pour que je puisse savoir quoi répondre.
Ce n'est plus un pb de compétences ici mais d'organisation de ton code et je me suis déjà exprimé 20 fois sur le sujet. Tu as tellement de conditions que ça devient problématique quand tu veux ajouter une fonctionnalité parce qu'elle rentre en conflit avec les autres. C'est pour ça que je te dis de tout lister et de faire les liens entre toutes les fonctionnalités pour savoir où tu en es et où des conflits peuvent arriver.
Mais ça, ce n'est pas à moi ni à personne d'autre de te le faire ou de te le dire. C'est ton programme. Tu as décidé de faire une architecture conditionnelle, tu dois t'organiser pour la mener à bien.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
RESOLU : [MY-AL] velo garde sa vitesse
Bojour
Pb résolu. J'ai fait comme tu l'as dit, j'ai regardé image par image le comportement des engins.
J'ai repris le code initial sans Struct et modifier ceci dans GestionDetecteur
maintenant, les engins prennent la vitesse de celui de devant.
Et dans un embouteillage, ils ne repartent pas tous en même temps.
Merci
Pb résolu. J'ai fait comme tu l'as dit, j'ai regardé image par image le comportement des engins.
J'ai repris le code initial sans Struct et modifier ceci dans GestionDetecteur
Code : Tout sélectionner
if (other.tag == "VEHICULE") {
if (kmhActuel > other.GetComponent<TrajetVl>().kmhActuel) // si je rattrape VEHICULE devant
// et ma vitesse Actuelle plus rapide
kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; // je prends sa vitesse Actuelle
}
Et dans un embouteillage, ils ne repartent pas tous en même temps.
Code : Tout sélectionner
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
// la fonction de trajet aérien est bloquée
/* Create by :
* Fabian Métayer
* 27/10/2015
*
* Modifle 15-1-2019 pour véhicules et perso escalier
*
*
* Modifier 04-03-2022 pour Tunnel
*
* AJOUTER AU 3° POINTS DE TOUS LES TRAJETS le cube de detecteur ON du PREFAB Stop_Cédez le passage FOS
* car quand on a mofidié si vl touche le vl de devant il prend sa vitesse
* ça a mis à false coupeDetecteur donc les vehicules ne reçoivent plus de consigne
* ça bug pour les clignotants et la camera aérienne regardait dans son dos
*
* si 2 vl se croisent sur la MEME trajectoire mais en sens inverse cela désactive le détecteur
* donc il faudra mettre APRES le croisement le cube de detecteur ON du PREFAB Stop_Cédez le passage FOS
*
*
*/
public class TrajetVl : MonoBehaviour {
public GameObject target_Path;
public float kmh; // vitesse voulue
public float kmhActuel; // vitesse reelle
public float mEntrePoint = 5.0f;
private float time;
public float fraction;
public Transform[] tabtList = new Transform[11];
public int minTab = 0;
public Transform detecteur;
public LayerMask layerPanneau;
public Collider[] toucheDetecteur;
public bool coupeDetecteur;
private Light jourNuit; //private
private GameObject eclairage; //private
private bool dansUnTunnel = false; // pour allumage des feux dans un tunnel, le tunnel est tagué en TUNNEL et a la forme 3D du tunnel réel
private GameObject eclairageFreins;
public GameObject clignotantsDroits;
public GameObject clignotantsGauche;
private IEnumerator coroutineClignotants;
public InterieurVl interieur;
public void DemrageVl () {
tabtList = new Transform[11];
TabDynamique ();
if (transform.FindChild("Detecteur"))
detecteur = transform.FindChild("Detecteur").transform;
jourNuit = GameObject.Find("Sky Dome").transform.FindChild("Light").GetComponent<Light>();
//cherche dans ces enfants un object avec le nom Eclairage
//si existe alors on ajoute l'object portant le nom "Eclairage" dans la variable eclairage
if (this.transform.FindChild ("Eclairage")) {
eclairage = this.transform.FindChild ("Eclairage").gameObject;
}
if (this.transform.FindChild ("Eclairage_Freins")) {
eclairageFreins = this.transform.FindChild ("Eclairage_Freins").gameObject;
eclairageFreins.SetActive (false);
}
if (this.transform.FindChild ("Eclairage_Clignotants_droits")) {
clignotantsDroits = this.transform.FindChild ("Eclairage_Clignotants_droits").gameObject;
clignotantsDroits.SetActive (false);
}
if (this.transform.FindChild ("Eclairage_Clignotants_gauche")) {
clignotantsGauche = this.transform.FindChild ("Eclairage_Clignotants_gauche").gameObject;
clignotantsGauche.SetActive (false);
}
StartCoroutine("WalkThePath");
}
public void TabDynamique () {
fraction = 0.1f;
int count = 0;
for (int i = 0; i < 11; i++) {
if (minTab+i < target_Path.transform.childCount) {
tabtList[i] = target_Path.transform.GetChild(minTab+i);
count++;
}
}
if (minTab+8 < target_Path.transform.childCount)
minTab += 8;
else
minTab += count;
}
public void StopCoroutine () {
StopCoroutine("WalkThePath");
}
/*
// version du createur DOTWEENN
void LateUpdate () {
//nombre de point * distance entre point / km/h / 3.6
time = (tabt.Length * mEntrePoint)/(kmh / 3.6f);
if (start) {
transform.position = iTween.PointOnPath(tabt, fraction);
fraction += Time.deltaTime / time;
if (fraction > 1.0f)
fraction = 0.0f;
transform.LookAt(iTween.PointOnPath(tabt, fraction + 0.001f));
}
}*/
IEnumerator WalkThePath () {
while(true){
time = ((tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f)*0.88f);// original (tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f)
/*
scene 2x2
362 x 5m = 1 810m
130 kmh/h fait 36.1111 mn/s donc 1 810m à 130km/h fait 50 sec / 55 sec réelles donc x0.91 pour avoir 50 sec
110 kmh/h fait 30.5555 mn/s donc 1 810m à 110km/h fait 59 sec / 64 sec réelles donc x0.91 pour avoir 59 sec
scene bi-di
305 x 5m = 1 525m
90 kmh/h fait 25 mn/s donc 1 525m à 90km/h fait 61 sec / 66 sec réelles donc x0.91 pour avoir 60 sec
50 kmh/h fait 13.888 mn/s donc 1 525m à 50km/h fait 110 sec/ 117 sec réelles donc x0.91 pour avoir 107 sec
*/
transform.position = iTween.PointOnPath (tabtList, fraction);
fraction += Time.deltaTime / time;
if (fraction > 1.0f)
fraction = 0.0f;
/* modif pour vehicule ou personnage*/
if (gameObject.tag == "VELO" || gameObject.tag == "VEHICULE" || gameObject.tag == "BUS"/*Et tous les autres comme MOTO, CAMION, etc*/)
{
transform.LookAt(iTween.PointOnPath(tabtList, fraction + 0.08f)); //0.05F plus c'est petit est plus de tremblote pour s'orienter sur le point à 0.005m
}
else //c'est les pietons, qui restent verticaux, ou la camera aérienne qui n'a pas besoin de suivre la pente du terrain
{
Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.08f); //0.05F
direction.y = this.transform.position.y;
transform.LookAt(direction);
}
// Accélération , freinage
/*
Oui.
Tu peux voir ça comme une interpolation linéaire si tu veux.
En multipliant une valeur par deltaTime, tu t'assures qu'elle vaudra sa valeur complète au bout d'une seconde.
Ex:x = x + 7 * deltaTime;
x vaudra 7 lorsque la somme des deltaTimes vaudra 1. Tu fais donc du "7 par seconde" quelque soit le taux de rafraîchissement de la fenêtre.
Ainsi, si tu veux que ta voiture prenne 15 kmh en une seconde, il te faut remplacer 0.7 par 15.
Si tu veux qu'elle freine de 20 kmh en une seconde, il te faut remplacer 0.9 par 20.
*/
/*if (kmhActuel < kmh){
kmhActuel += 0.7f;// acceleration jusqu'à la vitesse kmh 0.7f
} else if (kmhActuel > kmh && kmh != 0) {
kmhActuel -= 0.9f;// decceleration douce 0.9
} else if (kmh == 0) {
kmhActuel = 0;// on stoppe brutalement le VL
}*/
if (kmhActuel < kmh){
kmhActuel = kmhActuel + 100f*Time.deltaTime;// // acceleration de la vitesse de 100kmh par seconde
} else if (kmhActuel > kmh && kmh != 0) {
kmhActuel = kmhActuel - 50f*Time.deltaTime;// // decceleration de la vitesse de 50kmh par seconde
} else if (kmh == 0) {
kmhActuel = 0;// on stoppe brutalement le VL
}
/*
// Mettre la condition forte en premier
if (kmh == 0)
{
kmhActuel = 0;// on stoppe brutalement le VL
}
else if (kmhActuel < kmh) //
{
// En utilisant un minimum tu bornes ta vitesse entre la vitesse en cours et la vitesse à prendre (kmh)
kmhActuel = Mathf.Min (kmhActuel + 30*Time.deltaTime, kmh);
// acceleration de la vitesse de 30 km/h par seconde
} else if (kmhActuel > kmh)
{
// En utilisant un maximum, tu bornes ta vitesse entre la vitesse en cours et la vitesse à prendre (kmh)
kmhActuel = Mathf.Max (kmhActuel - 50f*Time.deltaTime, kmh);
// decceleration de la vitesse de 50kmh par seconde
}
*/
if (fraction >= 0.9f) //0.9f
TabDynamique();
GestionDetecteur ();
GestionLumiere ();
GestionFreins ();
yield return null;
}
}
void GestionDetecteur () {
if (detecteur != null) {
if (gameObject.tag == "VEHICULE")
toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.75f, layerPanneau);
else
toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.5f, layerPanneau);
if (toucheDetecteur.Length != 0) {
foreach (Collider other in toucheDetecteur) {
if (other.tag == "CoupeDetecteur") {
coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
kmhActuel = 30.0f;// pour degager les croisements à 30 km/h
// tant que la sphere du détecteur est dans l'objet sa vitesse est de 30 km/h
// apres le VL reprend sa vitesse normale
}
if (other.tag == "CoupeDetecteurAutre") {
coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
kmhActuel = 4.0f;
}
/////// Pour que vehicule se mette à la vitesse du velo qui est devant Pour maquette sous tunnel
if (other.tag == "VELO") {
coupeDetecteur = other.GetComponent<TrajetVl>().detecteur;
kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; //
}
//////////////////////////
if (coupeDetecteur == false) {
if (other.tag == "ModifVitesse") {
kmh = other.GetComponent<Panneau>().vitesse;
} else if (other.tag == "EntreeInstersection") {
kmh = GetPrioriteVitesse(other);
} else if (other.tag == "VEHICULE") {
if (kmhActuel > other.GetComponent<TrajetVl>().kmhActuel) // si je rattrape VEHICULE devant
// et ma vitesse Actuelle plus rapide
kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; // je prends sa vitesse Actuelle
}//***************
else if (other.tag == "BUS") {
if (kmhActuel > other.GetComponent<TrajetVl>().kmhActuel) // si je rattrape VEHICULE devant
// et ma vitesse Actuelle plus rapide
kmhActuel = other.GetComponent<TrajetVl>().kmhActuel; // je prends sa vitesse Actuelle
} //***************
else if (other.tag == "ClignotantsOn") {
kmh = other.GetComponent<GestionClignotants>().vitesse;
if (other.GetComponent<GestionClignotants>().trajet == target_Path) {
ClignotantsOff ();
if (other.GetComponent<GestionClignotants>().enumClignotants == EnumClignotants.Droites) {
coroutineClignotants = ClignotantsDroits();
StartCoroutine (coroutineClignotants);
} else {
coroutineClignotants = ClignotantsGauche();
StartCoroutine (coroutineClignotants);
}
}
} else if (other.tag == "ClignotantsOff") {
kmh = other.GetComponent<GestionClignotants>().vitesse;
ClignotantsOff ();
}
}
}
}
if (kmhActuel == 0 && toucheDetecteur.Length == 0)
kmhActuel = 30.0f;
}
}
//------------------------------------------------------------------------------------
// allumage et extinction des feux dans un tunnel
void OnTriggerEnter(Collider other) //ENTREE DU TUNNEL
//le collider MAYA 3D en forme de tunnel doit etre tagué TUNNEL et que ce script est attaché a un objet tagué VEHICULE ou VELO
{
if (other.tag == "TUNNEL" && (gameObject.tag == "VEHICULE" || gameObject.tag == "VELO"))
{
dansUnTunnel = true;
}
}
void OnTriggerExit(Collider other) //SORTIE DU TUNNEL (UN SEUL COLLIDER ENTIER MAYA 3D en forme de tunnel)
{
if (other.tag == "TUNNEL" && (gameObject.tag == "VEHICULE" || gameObject.tag == "VELO"))
{
dansUnTunnel = false;
}
}
// ------------------------------
void GestionLumiere () {
if (eclairage != null)
{
// SI TU ES DANS UN TUNNEL TU ALLUMES LES FEUX QUEL QUE SOIT LE JOUR/NUIT
if (dansUnTunnel) {
eclairage.SetActive (true);
}
// SINON C'EST LE JOUR/NUIT QUI S'EN OCCUPE
else {
if (jourNuit.intensity < 0.15f) {
if (eclairage.activeInHierarchy == false)
eclairage.SetActive (true);
}
else {
if (eclairage.activeInHierarchy == true)
eclairage.SetActive (false);
}
}
}
}
void GestionFreins () {
if (eclairageFreins != null){
if (kmhActuel > kmh+3 || kmhActuel == 0) {
if (eclairageFreins.activeInHierarchy == false)
eclairageFreins.SetActive (true);
} else {
if (eclairageFreins.activeInHierarchy == true)
eclairageFreins.SetActive (false);
}
}
}
IEnumerator ClignotantsDroits () {
if (clignotantsDroits != null) {
while (true) {
clignotantsDroits.SetActive (true);
yield return new WaitForSeconds (0.3f);
clignotantsDroits.SetActive (false);
yield return new WaitForSeconds (0.3f);
}
}
}
IEnumerator ClignotantsGauche () {
if (clignotantsGauche != null) {
while (true) {
clignotantsGauche.SetActive (true);
yield return new WaitForSeconds (0.3f);
clignotantsGauche.SetActive (false);
yield return new WaitForSeconds (0.3f);
}
}
}
void ClignotantsOff () {
if (coroutineClignotants != null) {
StopCoroutine (coroutineClignotants);
if (clignotantsDroits != null)
clignotantsDroits.SetActive (false);
if (clignotantsGauche != null)
clignotantsGauche.SetActive (false);
coroutineClignotants = null;
}
}
float GetPrioriteVitesse(Collider other){
Priorite priorite = other.GetComponent<Priorite> ();
if (priorite != null) {
return priorite.vitesse;
} else {
PrioriteOllioules prioriteOllioules = other.GetComponent<PrioriteOllioules> ();
return prioriteOllioules.vitesse;
}
}
}