RESOLU [MY-AL] Modifier un serializable

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: [MY-AL] Modifier un serializable

Message par freepl » 24 Mars 2022 13:34

J'avais vu l'erreur mais en ajoutant la virgule j'avais ce message

Code : Tout sélectionner

Assets/SCRIPT/Route/DebutRoute.cs(126,83): error CS1525: Unexpected symbol `trajets'
Du coup j'avais envoyé le code sans la virgule
Mais avec ou sans virgule, le code erreur est le même.

Code avec la virgule

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using System;
// donne le% de véhicules

[Serializable]
public struct Trajets {
	public GameObject trajObject;
	public float vitesse;
	public float mEntrePoint;
	public DepartVl[] departVl;
	public float pCar;//
	public float pUtilitaire;//
	public float pSemi;//
	public float pBus;//
	public float pSemiLong;//
	public float pMoto;//
}

[Serializable]
public struct DepartVl {
	public int positionDepart;
	public float vitesseDepart;
}

public enum InterieurVl {
	None,
	Oui,
	Non
}

public class DebutRoute : MonoBehaviour {
	
	// script qui detruit le vl à la fin du parcours et l'instancie au départ
	// si true coché = début si false non coché = à fin
	
	/*Donc tu choisie dans l'inspector le nombre de vl que tu veux au lancement de ta maquette pour chaque trajet et le programme vas te les instancié automatiquement par rapport à la fraction et au trajet.

exemple :
ligne Vl depart 4 , car j'ai 4 voies
element 0  : 4 si je veux 4 vl affichés dès le lancement de la maquette sur cette voie
element 1  : 1 si je veux 1 vl affichés dès le lancement de la maquette sur cette voie
element 2  : 3 si je veux 3 vl affichés dès le lancement de la maquette sur cette voie
element 3  : 10 si je veux 10 vl affichés dès le lancement de la maquette sur cette voie

Pour element0 , on a mis 0. Il y aura 0 véhicuke sur le trajet à 0.0,  0.25,  0.5 et  0.75
Pour element3 , on a mis 10. Il y aura 10 véhicuke sur le trajet à 0,0.  0.1,  0.2,  0.3, ....., 0.9

Il n'y a acucun vl à 1 car il serait à la fin du trajet et donc invisible !


*/
	public Trajets[] trajets;
	private int choixTrajet;
	
	// pour multiplier le temps d'apparition des vl la nuit
	public float multiplicateurNuit = 1.0f; 
	// temps apparition entre chaque voiture choisi au hasard
	public float[] tempsApparition; // dans inspector donner le nombre de temsp puis les renseigner
	//choisis un temps aléatoire
	private int choixTemps;
	private float temps;
	
	public float pCar;
	public float pUtilitaire;
	public float pSemi;
	public float pBus;
	public float SpSemiLong;
	public float pMoto;
	
	private int choixPourcentage;
	
	private bool finStart;
	private Light jourNuit;
	
	void Start () {
		choixTemps = UnityEngine.Random.Range(0,tempsApparition.Length);
		choixTrajet = UnityEngine.Random.Range(0,trajets.Length);
		choixPourcentage = UnityEngine.Random.Range(1,101);
		
		if (pCar + pUtilitaire + pSemi + pBus + SpSemiLong + pMoto > 100)
			Debug.LogError("il y a plus de 100%");
		if (pCar + pUtilitaire + pSemi + pBus  + SpSemiLong  + pMoto < 100)
			Debug.LogError("il y a moin de 100%");
		
		for (int i = 0; i < trajets.Length; i++) {
			CreationVlDepart (i);
		}
		// 1 ° gamobject car seul dans la hierarchy.on va chercher sky Dome
		// je prends son enfant Light
		// dans Inspector on prend Light
		
		jourNuit = GameObject.Find("Sky Dome").transform.FindChild("Light").GetComponent<Light>();
		
		finStart = true;
	}
	
	// Update is called once per frame
	void Update () {
		if (finStart && Time.timeScale != 0) {
			temps += Time.fixedDeltaTime;
			
			// on multiplie le temps d'apparition si light < à 0.15
			float tempsTempoApparition = 0.0f;
			if ( jourNuit.intensity < 0.15f) {
				tempsTempoApparition = tempsApparition[choixTemps] * multiplicateurNuit;
			}
			else  {
				tempsTempoApparition = tempsApparition[choixTemps];
			}
			
			//automatiquement
			if (temps >= tempsTempoApparition) {
				CreationVl(trajets[choixTrajet].trajObject, trajets[choixTrajet].mEntrePoint, trajets[choixTrajet].vitesse, 0);
				choixTemps = UnityEngine.Random.Range(0,tempsApparition.Length);
				choixTrajet = UnityEngine.Random.Range(0,trajets.Length);
				choixPourcentage = UnityEngine.Random.Range(1,101);
				temps = 0;
			}
		}
	}
	
	void CreationVlDepart (int countTrajet) {
		if (trajets[countTrajet].departVl.Length != 0) {
			for (int i = 0; i < trajets[countTrajet].departVl.Length; i++) {
				CreationVl (trajets[countTrajet].trajObject trajets[countTrajet].mEntrePoint, trajets[countTrajet].departVl[i].vitesseDepart, trajets[countTrajet].departVl[i].positionDepart);
			}
		}
	}
	
	public void CreationVl (Trajets trajet, float metre, float vitesseFraction, int position) {
		string nom = "";
		int choixVl = 0;
		InterieurVl interieur = InterieurVl.None;
		
		//voitures
		if (choixPourcentage < trajet.pCar) {
			choixVl = UnityEngine.Random.Range(1,19); //19car il y a 18 voitures + 1
			nom = "Voitures/Car_";
			interieur = InterieurVl.Oui;
			//utilitaires
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire) {
			choixVl = UnityEngine.Random.Range(1,14);//14 car il y a  13 utilitaires+ 1
			nom = "Utilitaires/utilitaire_";
			interieur = InterieurVl.Oui;
			//semi
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire + trajet.pSemi) {
			choixVl = UnityEngine.Random.Range(1,9);//car 8 camions ne pas prendre les porte char et le double remoque
			nom = "Poids_Lourds/semi_";
			interieur = InterieurVl.Oui;
			
			//bus
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire + trajet.pSemi + trajet.pBus) {
			choixVl = UnityEngine.Random.Range(1,4);//car 3 bus +1
			nom = "BUS/bus_";
			interieur = InterieurVl.Oui;
			
			
			//semi long  2 remorque et porte char
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire + trajet.pSemi+ trajet.pBus + trajet.pSemiLong) {
			choixVl = UnityEngine.Random.Range(1,4);//car 2 porte chars et le double remoque
			nom = "Super_Poids_Lourds_Longs/semiLong_";
			interieur = InterieurVl.Oui;
			//moto
		} else if (choixPourcentage <= trajet.pCar + trajet.pUtilitaire + trajet.pSemi+ trajet.pBus + trajet.pSemiLong + trajet.pMoto) {
			choixVl = UnityEngine.Random.Range(1,9);//9
			nom = "Motos/moto_";
			interieur = InterieurVl.Non;
		}
		
		
		GameObject instance = Instantiate(Resources.Load(""+nom+choixVl,typeof(GameObject))) as GameObject;
		
		//modif du non
		instance.name += trajet.name;
		//change la postion de l'object dans le scéne
		//donc transform = à l'obejct qui contient le script DebutRoute
		instance.transform.SetParent(transform);
		
		if (GetComponent<TrajetVl>() != null) {
			//set le parcour sur l'object
			instance.GetComponent<TrajetVl>().target_Path = trajet;
			//modif la vitesse de l'object
			instance.GetComponent<TrajetVl>().kmh = vitesseFraction;
			instance.GetComponent<TrajetVl>().kmhActuel = vitesseFraction;
			instance.GetComponent<TrajetVl>().minTab = position;
			instance.GetComponent<TrajetVl>().mEntrePoint = metre;
			instance.GetComponent<TrajetVl>().interieur = interieur;
			instance.GetComponent<TrajetVl>().DemrageVl();
		} else {
			//set le parcour sur l'object
			instance.GetComponentInChildren<TrajetVl>().target_Path = trajet;
			//modif la vitesse de l'object
			instance.GetComponentInChildren<TrajetVl>().kmh = vitesseFraction;
			instance.GetComponentInChildren<TrajetVl>().kmhActuel = vitesseFraction;
			instance.GetComponentInChildren<TrajetVl>().minTab = position;
			instance.GetComponentInChildren<TrajetVl>().mEntrePoint = metre;
			instance.GetComponentInChildren<TrajetVl>().interieur = interieur;
			instance.GetComponentInChildren<TrajetVl>().DemrageVl();
		}
	}
}

Avatar de l’utilisateur
jmhoubre
Messages : 856
Inscription : 05 Oct 2019 22:05

Re: [MY-AL] Modifier un serializable

Message par jmhoubre » 24 Mars 2022 18:08

Tu as déjà essayé d'enlever l'espace et de le remettre ?
Mieux, tu enlèves ', t' (la virgule, l'espace et le t), et tu retapes les 3 signes.

Tu as l'erreur dans Visual Studio ou juste dans la console d'Unity ?

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

Re: [MY-AL] Modifier un serializable

Message par boubouk50 » 24 Mars 2022 18:38

Code : Tout sélectionner

CreationVl (trajets[countTrajet].trajObject, trajets[countTrajet].mEntrePoint, trajets[countTrajet].departVl[i].vitesseDepart, trajets[countTrajet].departVl[i].positionDepart);
Ca c'est bon. Il n'y a pas d'erreurs. Si une erreur apparaît c'en est une autre qui est l'appel à CreationVl

Code : Tout sélectionner

public void CreationVl (Trajets trajet, float metre, float vitesseFraction, int position)
Tu donnes trajObject qui est un gameObject, mais trajet est de type Trajets.
Soit tu donnes le Trajets, soit tu changes le type de paramètre en GameObject.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

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

Re: [MY-AL] Modifier un serializable

Message par freepl » 24 Mars 2022 23:30

Bonjour
J'ai modifié en Gameobject trajet mais j'ai toujours le même code erreur

Code : Tout sélectionner

public void CreationVl (GameObject trajet, float metre, float vitesseFraction, int position) {

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

Re: [MY-AL] Modifier un serializable

Message par boubouk50 » 25 Mars 2022 10:24

boubouk50 a écrit :
24 Mars 2022 18:38

Code : Tout sélectionner

CreationVl (trajets[countTrajet].trajObject, trajets[countTrajet].mEntrePoint, trajets[countTrajet].departVl[i].vitesseDepart, trajets[countTrajet].departVl[i].positionDepart);
Et la virgule dans l'appel de la fonction?
Remets le message d'erreur stp, et le code si modifié.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

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

Re: [MY-AL] Modifier un serializable

Message par freepl » 25 Mars 2022 11:05

Bonjour
Voici le code modifié avec la virgule et GameObject trajet. Le code ne reconnait pas les pcar, putilitiaire ... qui sont rouge dans le lecteur
Z067.jpg
Z067.jpg (338.38 Kio) Consulté 2236 fois

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using System;
// donne le% de véhicules

[Serializable]
public struct Trajets {
	public GameObject trajObject;
	public float vitesse;
	public float mEntrePoint;
	public DepartVl[] departVl;
	public float pCar;//
	public float pUtilitaire;//
	public float pSemi;//
	public float pBus;//
	public float pSemiLong;//
	public float pMoto;//
}

[Serializable]
public struct DepartVl {
	public int positionDepart;
	public float vitesseDepart;
}

public enum InterieurVl {
	None,
	Oui,
	Non
}

public class DebutRoute : MonoBehaviour {
	
	// script qui detruit le vl à la fin du parcours et l'instancie au départ
	// si true coché = début si false non coché = à fin
	
	/*Donc tu choisie dans l'inspector le nombre de vl que tu veux au lancement de ta maquette pour chaque trajet et le programme vas te les instancié automatiquement par rapport à la fraction et au trajet.

exemple :
ligne Vl depart 4 , car j'ai 4 voies
element 0  : 4 si je veux 4 vl affichés dès le lancement de la maquette sur cette voie
element 1  : 1 si je veux 1 vl affichés dès le lancement de la maquette sur cette voie
element 2  : 3 si je veux 3 vl affichés dès le lancement de la maquette sur cette voie
element 3  : 10 si je veux 10 vl affichés dès le lancement de la maquette sur cette voie

Pour element0 , on a mis 0. Il y aura 0 véhicuke sur le trajet à 0.0,  0.25,  0.5 et  0.75
Pour element3 , on a mis 10. Il y aura 10 véhicuke sur le trajet à 0,0.  0.1,  0.2,  0.3, ....., 0.9

Il n'y a acucun vl à 1 car il serait à la fin du trajet et donc invisible !


*/
	public Trajets[] trajets;
	private int choixTrajet;
	
	// pour multiplier le temps d'apparition des vl la nuit
	public float multiplicateurNuit = 1.0f; 
	// temps apparition entre chaque voiture choisi au hasard
	public float[] tempsApparition; // dans inspector donner le nombre de temsp puis les renseigner
	//choisis un temps aléatoire
	private int choixTemps;
	private float temps;
	
	public float pCar;
	public float pUtilitaire;
	public float pSemi;
	public float pBus;
	public float SpSemiLong;
	public float pMoto;
	
	private int choixPourcentage;
	
	private bool finStart;
	private Light jourNuit;
	
	void Start () {
		choixTemps = UnityEngine.Random.Range(0,tempsApparition.Length);
		choixTrajet = UnityEngine.Random.Range(0,trajets.Length);
		choixPourcentage = UnityEngine.Random.Range(1,101);
		
		if (pCar + pUtilitaire + pSemi + pBus + SpSemiLong + pMoto > 100)
			Debug.LogError("il y a plus de 100%");
		if (pCar + pUtilitaire + pSemi + pBus  + SpSemiLong  + pMoto < 100)
			Debug.LogError("il y a moin de 100%");
		
		for (int i = 0; i < trajets.Length; i++) {
			CreationVlDepart (i);
		}
		// 1 ° gamobject car seul dans la hierarchy.on va chercher sky Dome
		// je prends son enfant Light
		// dans Inspector on prend Light
		
		jourNuit = GameObject.Find("Sky Dome").transform.FindChild("Light").GetComponent<Light>();
		
		finStart = true;
	}
	
	// Update is called once per frame
	void Update () {
		if (finStart && Time.timeScale != 0) {
			temps += Time.fixedDeltaTime;
			
			// on multiplie le temps d'apparition si light < à 0.15
			float tempsTempoApparition = 0.0f;
			if ( jourNuit.intensity < 0.15f) {
				tempsTempoApparition = tempsApparition[choixTemps] * multiplicateurNuit;
			}
			else  {
				tempsTempoApparition = tempsApparition[choixTemps];
			}
			
			//automatiquement
			if (temps >= tempsTempoApparition) {
				CreationVl(trajets[choixTrajet].trajObject, trajets[choixTrajet].mEntrePoint, trajets[choixTrajet].vitesse, 0);
				choixTemps = UnityEngine.Random.Range(0,tempsApparition.Length);
				choixTrajet = UnityEngine.Random.Range(0,trajets.Length);
				choixPourcentage = UnityEngine.Random.Range(1,101);
				temps = 0;
			}
		}
	}
	
	void CreationVlDepart (int countTrajet) {
		if (trajets[countTrajet].departVl.Length != 0) {
			for (int i = 0; i < trajets[countTrajet].departVl.Length; i++) {
				CreationVl (trajets[countTrajet].trajObject, trajets[countTrajet].mEntrePoint, trajets[countTrajet].departVl[i].vitesseDepart, trajets[countTrajet].departVl[i].positionDepart);
			}
		}
	}
	
	public void CreationVl (GameObject trajet, float metre, float vitesseFraction, int position) {
		string nom = "";
		int choixVl = 0;
		InterieurVl interieur = InterieurVl.None;
		
		//voitures
		if (choixPourcentage < trajet.pCar) {
			choixVl = UnityEngine.Random.Range(1,19); //19car il y a 18 voitures + 1
			nom = "Voitures/Car_";
			interieur = InterieurVl.Oui;
			//utilitaires
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire) {
			choixVl = UnityEngine.Random.Range(1,14);//14 car il y a  13 utilitaires+ 1
			nom = "Utilitaires/utilitaire_";
			interieur = InterieurVl.Oui;
			//semi
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire + trajet.pSemi) {
			choixVl = UnityEngine.Random.Range(1,9);//car 8 camions ne pas prendre les porte char et le double remoque
			nom = "Poids_Lourds/semi_";
			interieur = InterieurVl.Oui;
			
			//bus
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire + trajet.pSemi + trajet.pBus) {
			choixVl = UnityEngine.Random.Range(1,4);//car 3 bus +1
			nom = "BUS/bus_";
			interieur = InterieurVl.Oui;
			
			
			//semi long  2 remorque et porte char
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire + trajet.pSemi+ trajet.pBus + trajet.pSemiLong) {
			choixVl = UnityEngine.Random.Range(1,4);//car 2 porte chars et le double remoque
			nom = "Super_Poids_Lourds_Longs/semiLong_";
			interieur = InterieurVl.Oui;
			//moto
		} else if (choixPourcentage <= trajet.pCar + trajet.pUtilitaire + trajet.pSemi+ trajet.pBus + trajet.pSemiLong + trajet.pMoto) {
			choixVl = UnityEngine.Random.Range(1,9);//9
			nom = "Motos/moto_";
			interieur = InterieurVl.Non;
		}
		
		
		GameObject instance = Instantiate(Resources.Load(""+nom+choixVl,typeof(GameObject))) as GameObject;
		
		//modif du non
		instance.name += trajet.name;
		//change la postion de l'object dans le scéne
		//donc transform = à l'obejct qui contient le script DebutRoute
		instance.transform.SetParent(transform);
		
		if (GetComponent<TrajetVl>() != null) {
			//set le parcour sur l'object
			instance.GetComponent<TrajetVl>().target_Path = trajet;
			//modif la vitesse de l'object
			instance.GetComponent<TrajetVl>().kmh = vitesseFraction;
			instance.GetComponent<TrajetVl>().kmhActuel = vitesseFraction;
			instance.GetComponent<TrajetVl>().minTab = position;
			instance.GetComponent<TrajetVl>().mEntrePoint = metre;
			instance.GetComponent<TrajetVl>().interieur = interieur;
			instance.GetComponent<TrajetVl>().DemrageVl();
		} else {
			//set le parcour sur l'object
			instance.GetComponentInChildren<TrajetVl>().target_Path = trajet;
			//modif la vitesse de l'object
			instance.GetComponentInChildren<TrajetVl>().kmh = vitesseFraction;
			instance.GetComponentInChildren<TrajetVl>().kmhActuel = vitesseFraction;
			instance.GetComponentInChildren<TrajetVl>().minTab = position;
			instance.GetComponentInChildren<TrajetVl>().mEntrePoint = metre;
			instance.GetComponentInChildren<TrajetVl>().interieur = interieur;
			instance.GetComponentInChildren<TrajetVl>().DemrageVl();
		}
	}
}
coder erreur

Code : Tout sélectionner

Assets/SCRIPT/Route/DebutRoute.cs(165,55): error CS1061: Type `UnityEngine.GameObject' does not contain a definition for `pCar' and no extension method `pCar' of type `UnityEngine.GameObject' could be found (are you missing a using directive or an assembly reference?)

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

Re: [MY-AL] Modifier un serializable

Message par boubouk50 » 25 Mars 2022 13:29

Bon, là, c'est presque de l'insolence à ce niveau... :o

C'est la base même de la programmation.

Tu as décidé de déclarer trajet comme un gameObject. Ok.
GameObject est une classe qui contient des propriétés (ex: tag) et des méthodes (ex: SetActive (bool isActive))
Elle ne contient pas par contre: ni pCar, ni pUtilitaire, ni tout ce que tu as défini dans ta Structure Trajets.
Et pourtant tu essaies de faire: trajet.pCar. Donc de chercher la propriété pCar de la classe GameObject. Qui n'existe pas et qui renvoie donc l'erreur Type `UnityEngine.GameObject' does not contain a definition for `pCar' i.e. en français: GameObject ne contient pas de définition pour 'pCar'.
L'erreur est limpide.

Donc pour accéder à pCar, il te faut avoir accès au Trajets.

Code : Tout sélectionner

public void CreationVl (Trajets trajet, float metre, float vitesseFraction, int position)
Donc ça c'est bon, mais il faut revoir son appel:

Code : Tout sélectionner

CreationVl (trajets[countTrajet], trajets[countTrajet].mEntrePoint, trajets[countTrajet].departVl[i].vitesseDepart, trajets[countTrajet].departVl[i].positionDepart);
Comme tous tes arguments sont des dérivés du trajet, tu n'as pas vraiment besoin de les passer d'ailleurs:

Code : Tout sélectionner

CreationVl (countTrajet, i);
...
public void CreationVl (int trajCount, int index)
{
	float metre = trajets[trajCount].mEntrePoint;
	float vitesseFraction = trajets[trajCount].departVl[index].vitesseDepart;
	int position = trajets[trajCount].departVl[index].positionDepart;
...
}
C'est une suggestion, pas une nécessité, tu fais comme tu veux.

Par contre, stp, essaie de comprendre un minimum ce que tu fais parce que là, c'est vraiment un problème d'archi débutant, une base OBLIGATOIRE de la programmation que tu devrais avoir acquis depuis longtemps.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

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

Re: [MY-AL] Modifier un serializable

Message par freepl » 25 Mars 2022 14:00

pour ceci

Code : Tout sélectionner

CreationVl (countTrajet, i);
Ce n'est pas une variable à déclarer et je ne vois pas où le mettre
Z070.jpg
Z070.jpg (415.78 Kio) Consulté 2217 fois

code modifié

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using System;
// donne le% de véhicules

[Serializable]
public struct Trajets {
	public GameObject trajObject;
	public float vitesse;
	public float mEntrePoint;
	public DepartVl[] departVl;
	public float pCar;//
	public float pUtilitaire;//
	public float pSemi;//
	public float pBus;//
	public float pSemiLong;//
	public float pMoto;//
}

[Serializable]
public struct DepartVl {
	public int positionDepart;
	public float vitesseDepart;
}

public enum InterieurVl {
	None,
	Oui,
	Non
}

public class DebutRoute : MonoBehaviour {
	
	// script qui detruit le vl à la fin du parcours et l'instancie au départ
	// si true coché = début si false non coché = à fin
	
	/*Donc tu choisie dans l'inspector le nombre de vl que tu veux au lancement de ta maquette pour chaque trajet et le programme vas te les instancié automatiquement par rapport à la fraction et au trajet.

exemple :
ligne Vl depart 4 , car j'ai 4 voies
element 0  : 4 si je veux 4 vl affichés dès le lancement de la maquette sur cette voie
element 1  : 1 si je veux 1 vl affichés dès le lancement de la maquette sur cette voie
element 2  : 3 si je veux 3 vl affichés dès le lancement de la maquette sur cette voie
element 3  : 10 si je veux 10 vl affichés dès le lancement de la maquette sur cette voie

Pour element0 , on a mis 0. Il y aura 0 véhicuke sur le trajet à 0.0,  0.25,  0.5 et  0.75
Pour element3 , on a mis 10. Il y aura 10 véhicuke sur le trajet à 0,0.  0.1,  0.2,  0.3, ....., 0.9

Il n'y a acucun vl à 1 car il serait à la fin du trajet et donc invisible !


*/
	public Trajets[] trajets;
	private int choixTrajet;
	
	// pour multiplier le temps d'apparition des vl la nuit
	public float multiplicateurNuit = 1.0f; 
	// temps apparition entre chaque voiture choisi au hasard
	public float[] tempsApparition; // dans inspector donner le nombre de temsp puis les renseigner
	//choisis un temps aléatoire
	private int choixTemps;
	private float temps;
	
	public float pCar;
	public float pUtilitaire;
	public float pSemi;
	public float pBus;
	public float SpSemiLong;
	public float pMoto;
	
	private int choixPourcentage;
	
	private bool finStart;
	private Light jourNuit;
	
	void Start () {
		choixTemps = UnityEngine.Random.Range(0,tempsApparition.Length);
		choixTrajet = UnityEngine.Random.Range(0,trajets.Length);
		choixPourcentage = UnityEngine.Random.Range(1,101);
		
		if (pCar + pUtilitaire + pSemi + pBus + SpSemiLong + pMoto > 100)
			Debug.LogError("il y a plus de 100%");
		if (pCar + pUtilitaire + pSemi + pBus  + SpSemiLong  + pMoto < 100)
			Debug.LogError("il y a moin de 100%");
		
		for (int i = 0; i < trajets.Length; i++) {
			CreationVlDepart (i);
		}
		// 1 ° gamobject car seul dans la hierarchy.on va chercher sky Dome
		// je prends son enfant Light
		// dans Inspector on prend Light
		
		jourNuit = GameObject.Find("Sky Dome").transform.FindChild("Light").GetComponent<Light>();
		
		finStart = true;


	}
	
	// Update is called once per frame
	void Update () {
		if (finStart && Time.timeScale != 0) {
			temps += Time.fixedDeltaTime;
			
			// on multiplie le temps d'apparition si light < à 0.15
			float tempsTempoApparition = 0.0f;
			if ( jourNuit.intensity < 0.15f) {
				tempsTempoApparition = tempsApparition[choixTemps] * multiplicateurNuit;
			}
			else  {
				tempsTempoApparition = tempsApparition[choixTemps];
			}
			
			//automatiquement
			if (temps >= tempsTempoApparition) {
				CreationVl(trajets[choixTrajet].trajObject, trajets[choixTrajet].mEntrePoint, trajets[choixTrajet].vitesse, 0);
				choixTemps = UnityEngine.Random.Range(0,tempsApparition.Length);
				choixTrajet = UnityEngine.Random.Range(0,trajets.Length);
				choixPourcentage = UnityEngine.Random.Range(1,101);
				temps = 0;
			}
		}
	}
	
	void CreationVlDepart (int countTrajet) {
		if (trajets[countTrajet].departVl.Length != 0) {
			for (int i = 0; i < trajets[countTrajet].departVl.Length; i++) {
				CreationVl (trajets[countTrajet].trajObject, trajets[countTrajet].mEntrePoint, trajets[countTrajet].departVl[i].vitesseDepart, trajets[countTrajet].departVl[i].positionDepart);
			}
		}
	}
	
	public void CreationVl (int trajCount, int index) {
		float metre = trajets[trajCount].mEntrePoint;
		float vitesseFraction = trajets[trajCount].departVl[index].vitesseDepart;
		int position = trajets[trajCount].departVl[index].positionDepart;

		string nom = "";
		int choixVl = 0;
		InterieurVl interieur = InterieurVl.None;
		
		//voitures
		if (choixPourcentage < trajet.pCar) {
			choixVl = UnityEngine.Random.Range(1,19); //19car il y a 18 voitures + 1
			nom = "Voitures/Car_";
			interieur = InterieurVl.Oui;
			//utilitaires
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire) {
			choixVl = UnityEngine.Random.Range(1,14);//14 car il y a  13 utilitaires+ 1
			nom = "Utilitaires/utilitaire_";
			interieur = InterieurVl.Oui;
			//semi
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire + trajet.pSemi) {
			choixVl = UnityEngine.Random.Range(1,9);//car 8 camions ne pas prendre les porte char et le double remoque
			nom = "Poids_Lourds/semi_";
			interieur = InterieurVl.Oui;
			
			//bus
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire + trajet.pSemi + trajet.pBus) {
			choixVl = UnityEngine.Random.Range(1,4);//car 3 bus +1
			nom = "BUS/bus_";
			interieur = InterieurVl.Oui;
			
			
			//semi long  2 remorque et porte char
		} else if (choixPourcentage < trajet.pCar + trajet.pUtilitaire + trajet.pSemi+ trajet.pBus + trajet.pSemiLong) {
			choixVl = UnityEngine.Random.Range(1,4);//car 2 porte chars et le double remoque
			nom = "Super_Poids_Lourds_Longs/semiLong_";
			interieur = InterieurVl.Oui;
			//moto
		} else if (choixPourcentage <= trajet.pCar + trajet.pUtilitaire + trajet.pSemi+ trajet.pBus + trajet.pSemiLong + trajet.pMoto) {
			choixVl = UnityEngine.Random.Range(1,9);//9
			nom = "Motos/moto_";
			interieur = InterieurVl.Non;
		}
		
		
		GameObject instance = Instantiate(Resources.Load(""+nom+choixVl,typeof(GameObject))) as GameObject;
		
		//modif du non
		instance.name += trajet.name;
		//change la postion de l'object dans le scéne
		//donc transform = à l'obejct qui contient le script DebutRoute
		instance.transform.SetParent(transform);
		
		if (GetComponent<TrajetVl>() != null) {
			//set le parcour sur l'object
			instance.GetComponent<TrajetVl>().target_Path = trajet;
			//modif la vitesse de l'object
			instance.GetComponent<TrajetVl>().kmh = vitesseFraction;
			instance.GetComponent<TrajetVl>().kmhActuel = vitesseFraction;
			instance.GetComponent<TrajetVl>().minTab = position;
			instance.GetComponent<TrajetVl>().mEntrePoint = metre;
			instance.GetComponent<TrajetVl>().interieur = interieur;
			instance.GetComponent<TrajetVl>().DemrageVl();
		} else {
			//set le parcour sur l'object
			instance.GetComponentInChildren<TrajetVl>().target_Path = trajet;
			//modif la vitesse de l'object
			instance.GetComponentInChildren<TrajetVl>().kmh = vitesseFraction;
			instance.GetComponentInChildren<TrajetVl>().kmhActuel = vitesseFraction;
			instance.GetComponentInChildren<TrajetVl>().minTab = position;
			instance.GetComponentInChildren<TrajetVl>().mEntrePoint = metre;
			instance.GetComponentInChildren<TrajetVl>().interieur = interieur;
			instance.GetComponentInChildren<TrajetVl>().DemrageVl();
		}
	}
}

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

Re: [MY-AL] Modifier un serializable

Message par boubouk50 » 25 Mars 2022 15:40

C'est juste appliquer ce que j'ai dit plus haut...
Relis ce que j'ai écrit et essaie de le comprendre, là tu mélanges tout n'importe comment.
Le code que j'ai donné était une suggestion pas une obligation, d'une, et de deux tu m'as fais un mix des deux possibilités au lieu de n'en choisir qu'une.
Je vais finir par perdre patience, vraiment, j'ai l'impression que tu attends de copier-coller ce que je te donne sans lire ni comprendre. :rougefaché:

1/ ton appel de fonction ne correspond pas à sa déclaration
public void CreationVl (int trajCount, int index)
CreationVl (trajets[countTrajet].trajObject, trajets[countTrajet].mEntrePoint, trajets[countTrajet].departVl.vitesseDepart, trajets[countTrajet].departVl.positionDepart);
Tu vois bien que les arguments/paramètres ne concordent pas!

2/ Tu ne déclares pas trajet
Comment veux-tu accéder à des données d'une variable si tu ne dis pas ce qu'elle est?
Trajets trajet = /*la tu déclares et affectes*/;
Il faut le déclarer et l'affecter ou bien accéder directement au tableau qui est disponible partout.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

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

Re: [MY-AL] Modifier un serializable

Message par freepl » 07 Avr 2022 10:23

Bonjour

Il fallait faire un deuxième Serializable

Code : Tout sélectionner

[Serializable]
public struct TrajetsV2 {
  public GameObject trajet;
  public float vitesse;
  public float mEntrePoint;
  public DepartVl[] departVl;
  public PourcentageVl pourcentageVl;
}

[Serializable]
public struct PourcentageVl {
 public float pCar;
 public float pUtilitaire;
 public float pSemi;
 public float pBus;
 public float SpSemiLong;
 public float pMoto;
}
Merci

Répondre

Revenir vers « Scripting »