Faire le lien entre Start() et Update()

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Aurore
Messages : 11
Inscription : 20 Mars 2015 12:43

Faire le lien entre Start() et Update()

Message par Aurore » 06 Mai 2015 10:54

Hello,
je suis à nouveau confronté à un souci sur mon projet de gare et reviens donc solliciter vos conseils.
Je cherche à reproduire le parcours de 2 trains sur une gare dont la taille dépend d'un fichier de données fourni.
Je lis et parse les données avec StreamReader() dans Start() et ai fait une boucle du genre
while (encore des lignes)
if (ligne = train 1) position du train1
else if (ligne = train 2) position train 2
else distance entre les 2 trains
Le souci est que le Start() exécute tout le script avant de jouer l'animation, et donc m'affiche mes trains et leur distance à la dernière position lue et non une par une.

Du coup, je pensais peut être explorer du côté de l'Update() mais ne voit pas du tout si c'est possible de faire un appel à celui ci avant que mon fichier soit lu entièrement (et si oui comment le faire). Sachant que j'ai testé le coup du StreamReader dans l'Update() et que c'est pas une bonne idée du tout :) (trop de ressources demandées, application qui plante, pc pas content, développeuse non plus du coup).
Du coup, si quelqu'un a une piste à me proposer, je prends :) Si jamais, je précise que je code en C#.
Merci d'avance.

Avatar de l’utilisateur
spedy
Messages : 290
Inscription : 16 Nov 2010 16:32
Localisation : Aix en Provence

Re: Faire le lien entre Start() et Update()

Message par spedy » 06 Mai 2015 11:18

J'ai peut être pas tout compris mais dans l'idée tu peux parser ton fichier dans "Start" est stocker les positions dans un tableau.
Et effectuer les dépaclements dans une autre fonction 'Update", un Invoke, une coroutine, etc ...

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

Re: Faire le lien entre Start() et Update()

Message par boubouk50 » 06 Mai 2015 11:32

Considère le Start() comme une initialisation, une mise en place de départ.
Ensuite vient l'Update() qui est appelé à chaque frame, qui est une sorte de construction image par image dans le temps.

Ton while devrait être ton Update(), et chaque boucle de while un Update().
"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

Aurore
Messages : 11
Inscription : 20 Mars 2015 12:43

Re: Faire le lien entre Start() et Update()

Message par Aurore » 06 Mai 2015 11:53

Yes, je vais tester le coup du tableau pour garder au chaud toutes mes positions. Je vous redis si c'est bon ou pas.
Merci de vos réponses :)

Aurore
Messages : 11
Inscription : 20 Mars 2015 12:43

Re: Faire le lien entre Start() et Update()

Message par Aurore » 07 Mai 2015 21:29

Ok, alors effectivement, avoir un tableau est bien plus opti :) Encore merci. Par contre je suis confrontée un peu au même souci. Je m'explique : une fois le tableau postTab récupéré dans le Start(), je switch dans l'Update et traite le tableau (sachant qu'il contient donc en 1e ligne la position du train1, en 2e celle du 2e train et la 3e la distance qui les sépare :

Code : Tout sélectionner

		for (int i = 0; i < posTab.GetLength(0); i++)
		{
			for (int j =0; j < posTab.GetLength(1); j++)
			{
				int s = posTab[i, j];
				count++;
				if (count == 1)
				{
					locTrain1 = s;
					location = locTrain1;
					int portionRailT1 = Display.whichPartOfTrainStation(location, partOfRailRoad);//retrouve sur quelle portion se trouve le train
					float temp = partOfRailRoad/4;
					xTrain1 = locTrain1/temp;
					zTrain1 = locTrain1/temp;
					firstTrain.transform.position = new Vector3(xTrain1,yTrain1, zTrain1);
					Debug.Log("1e train :"+firstTrain.transform.position);
				}
				else if (count == 2)
				{
					locTrain2 = s;
					location = locTrain2;
					int portionRailT2 = Display.whichPartOfTrainStation(location, partOfRailRoad);
					float temp1 = partOfRailRoad/4;
					xTrain2 = location/temp1;
					zTrain2 = location/temp1;
					secondTrain.transform.position = new Vector3(xTrain2,yTrain2, zTrain2);
					Debug.Log("2e train :"+secondTrain.transform.position);
				}
				else if (count == 3)
				{
					distance = s;
					count =0;
				}
				else{Debug.Log("Erreur dans l'itération de posTab");}
			}
		}
Ce code fonctionne, mais seule ma dernière position n'est visible dans la scène. J'imagine que c'est dû au fait que ce n'est que lorsque la boucle est terminée que le visuel est généré. Je me suis un peu intéressée aux autres fonctions genre FixedUpdate() mais ça me semble un peu flou. J'ai l'impression que ça me donnera la même chose (peut être à tort). Je dirais pas non à quelques éclaircissements^^
D'avance, merci

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Faire le lien entre Start() et Update()

Message par ZJP » 07 Mai 2015 22:14

Aurore a écrit :Ok, alors effectivement, avoir un tableau est bien plus opti :) Encore merci. Par contre je suis confrontée un peu au même souci. Je m'explique : une fois le tableau postTab récupéré dans le Start(), je switch dans l'Update et traite le tableau (sachant qu'il contient donc en 1e ligne la position du train1, en 2e celle du 2e train et la 3e la distance qui les sépare :

for (int i = 0; i < posTab.GetLength(0); i++)
{
for (int j =0; j < posTab.GetLength(1); j++)
{
int s = posTab[i, j];
count++;
if (count == 1)
{
locTrain1 = s;
location = locTrain1;
int portionRailT1 = Display.whichPartOfTrainStation(location, partOfRailRoad);//retrouve sur quelle portion se trouve le train
float temp = partOfRailRoad/4;
xTrain1 = locTrain1/temp;
zTrain1 = locTrain1/temp;
firstTrain.transform.position = new Vector3(xTrain1,yTrain1, zTrain1);
Debug.Log("1e train :"+firstTrain.transform.position);
}
else if (count == 2)
{
locTrain2 = s;
location = locTrain2;
int portionRailT2 = Display.whichPartOfTrainStation(location, partOfRailRoad);
float temp1 = partOfRailRoad/4;
xTrain2 = location/temp1;
zTrain2 = location/temp1;
secondTrain.transform.position = new Vector3(xTrain2,yTrain2, zTrain2);
Debug.Log("2e train :"+secondTrain.transform.position);
}
else if (count == 3)
{
distance = s;
count =0;
}
else{Debug.Log("Erreur dans l'itération de posTab");}
}
}

Ce code fonctionne, mais seule ma dernière position n'est visible dans la scène. J'imagine que c'est dû au fait que ce n'est que lorsque la boucle est terminée que le visuel est généré. Je me suis un peu intéressée aux autres fonctions genre FixedUpdate() mais ça me semble un peu flou. J'ai l'impression que ça me donnera la même chose (peut être à tort). Je dirais pas non à quelques éclaircissements^^
D'avance, merci
a) Reprendre le code posté au dessus et le "passer" dans un éditeur quelconque pour l'indenter (Sans les tabulations qui posent quelque fois des soucis)
b) Le reposter entre les balises [ C O D E ] [ \ C O D E ] (le-4eme-bouton-après-le-B-au-dessus-de-la-zone-de-saisie-du-commentaire) pour une présentation qui fera moins foutage de .... et un bon début.

J'ai essayé, ce n'était pas insurmontable. La preuve :

Code : Tout sélectionner

for (int i = 0; i < posTab.GetLength(0); i++)
{
    for (int j =0; j < posTab.GetLength(1); j++)
    {
        int s = posTab[i, j];
        count++;
        if (count == 1)
        {
            locTrain1 = s;
            location = locTrain1;
            int portionRailT1 = Display.whichPartOfTrainStation(location, partOfRailRoad);//retrouve sur quelle portion se trouve le train
            float temp = partOfRailRoad/4;
            xTrain1 = locTrain1/temp;
            zTrain1 = locTrain1/temp;
            firstTrain.transform.position = new Vector3(xTrain1,yTrain1, zTrain1);
            Debug.Log("1e train :"+firstTrain.transform.position);
        }
        else if (count == 2)
        {
            locTrain2 = s;
            location = locTrain2;
            int portionRailT2 = Display.whichPartOfTrainStation(location, partOfRailRoad);
            float temp1 = partOfRailRoad/4;
            xTrain2 = location/temp1;
            zTrain2 = location/temp1;
            secondTrain.transform.position = new Vector3(xTrain2,yTrain2, zTrain2);
            Debug.Log("2e train :"+secondTrain.transform.position);
        }
        else if (count == 3)
        {
            distance = s;
            count =0;
        }
	else{Debug.Log("Erreur dans l'itération de posTab");}
    }
}


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

Re: Faire le lien entre Start() et Update()

Message par boubouk50 » 08 Mai 2015 16:22

:lol:

Tu peux expliquer ce que tu cherches à faire? Tu joues une animation? Tu fais avancer un train avec une suite de position?
Parce que là, ça va pas.

Je me répète, il faut voir la fonction Update() comme une boucle temporelle. Une frame équivaut à un Update() donc une animation qui prend 5000 frames prend 5000 Update(). Si tu fais tout d'un coup dans l'Update() tu referas en boucle la même chose, c'est à dire, tout traiter en même temps et ne voir que le résultat final: la dernière position.
"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

Aurore
Messages : 11
Inscription : 20 Mars 2015 12:43

Re: Faire le lien entre Start() et Update()

Message par Aurore » 08 Mai 2015 20:53

ZJP, n'y voit aucun foutage de...ma part, je suis simplement jeune sur ce forum et ne connait pas encore toutes les subtilités. Je ferai gaffe à l'avenir à celle-ci.
Boubouk, en fait le projet de départ est celui-ci : j'ai un fichier de données de locations de trains dans une gare. Je dois faire en sorte de simuler la scène en prenant en compte certaines contraintes, du genre les 2 trains ne doivent jamais se toucher, arriver à la barrière faire une pause etc...
J'ai commencé par lire les données et les parser, j'ai donc isolé et stocké chacune d'elle dans un tableau que je récupère dans mon main. Les prefab de ma scène y sont instanciés et tous les GO sont en places au démarrage de l'appli.
Le souci est là : je cherche à faire évoluer la position de mes trains sur ma gare à chaque nouvelle position soit à chaque nouvelles lignes lues de mon tableau.
Comme tu l'as surement remarqué, je ne travaille pas sur Unity depuis très longtemps est donc découvre au fur et à mesure de mes erreurs ses contraintes.
Simplement je ne vois pas comment faire un transform.position à chaque ligne lue de mon tableau, dynamiquement. En gros, je voudrais que les positions changent à chaque tour de boucle et non pas lorsqu'elle est lue entièrement.
J'espère avoir été plus claire cette fois-ci, c'est pas toujours simple de s'expliquer par écrit sans montrer le travail en cours :)
Merci en tout cas de te pencher sur mon problème^^

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Faire le lien entre Start() et Update()

Message par Alesk » 09 Mai 2015 18:19

Aurore, tu ferais bien de lire ça : viewtopic.php?f=2&t=2964

:mrgreen:

Aurore
Messages : 11
Inscription : 20 Mars 2015 12:43

Re: Faire le lien entre Start() et Update()

Message par Aurore » 09 Mai 2015 21:56

Ok bon, je pensais pourtant avoir bien cherché mes réponses avant de poster, autant pour moi. Désolée du dérangement en tout cas.

Répondre

Revenir vers « (C#) CSharp »