[C#] Import de fichiers créés @runtime [Résolu]

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
FabienTT
Messages : 67
Inscription : 06 Fév 2013 14:58

[C#] Import de fichiers créés @runtime [Résolu]

Message par FabienTT » 03 Mars 2015 11:34

Bonjour à tous,

J'espère que tout le monde va bien;

Je viens vous embêter car j'ai un problème que je ne parviens pas à résoudre. Je fais en général de mon mieux pour ne pas vous embêter, mais là je coince un peu quand même... =)
Je suis sur Unity 5.0.0.b9 (Pro donc). Je fais mes essais sur l'editor, c'est un détail qui peut avoir son importance.

Mon application s'interface avec une autre application, l'idée est simple : je visualise les résultats conçus sous une autre application qui n'a aucun lien avec Unity :
Sous unity, j'ai un menu qui me permet de modifier le contenu d'une base de données puis de lancer un .exe avec un startprocess(). Cet exe est une simulation qui dure environ 3 minutes et qui, une fois terminée, va générer une trentaine de fichiers.

Sous unity je vérifies l'état du process, et dès qu'il est terminé je récupère ces fichiers, je les ouvres les modifies et les réécris ailleurs.
Une fois modifiés et réécris ailleurs, je charge ces nouveaux fichiers automatiquement afin d'en visualiser le contenu.
(je le fais en deux étapes, car dans certains cas, je peux vouloir les modifier et les réécrire sans nécessairement les charger dans la foulée).

ça c'est en théorie.

en pratique, Unity plante lorsqu'il doit lire mon TextAsset avec un "object reference not set to an instance of an object".
Ce qui est assez curieux puisqu'avec un debug.log sur le TextAsset, juste avant la ligne qui pose problème, je peux en voir le contenu.

Ce qui est "troublant" c'est que si la fenêtre unity n'est pas focused, je n'ai pas de plantage, et tout marche à merveille.
En revanche si je reste focus sur Unity durant la simulation et durant l'automatisation du traitement des fichiers, il va planter à coup sûr.
Mais même lorsque cela arrive, si je retire la pause et que j'attends qu'Unity "import" automatiquement les nouveaux fichiers, puis que je demande manuellement leur traitement ou leur chargement, tout se passe à merveille.

En gros mon souci semble se situer au niveau de la prise en charge des fichiers par l'editeur. Y-a-til une solution ? j'ai cherché un code pour imposer l'import des ressources sous unityEditor avant de les traiter ou de les réécrire mais je n'ai pas trouvé.
J'ai vu que certains utilisaient la classe WWW mais j'aimerai l'éviter autant que possible.

Je n'ai pas envie de vous "noyer" sous mes lignes de code, et peut être que ce problème ne nécessite pas que vous le voyez. Si besoin est, je posterai les sections importantes.

Merci beaucoup, que vous puissiez m'aider ou pas !

Fabien.
Dernière édition par FabienTT le 11 Mars 2015 12:23, édité 1 fois.

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

Re: [C#] Import de fichiers créés @runtime

Message par boubouk50 » 03 Mars 2015 11:50

De ce que je lis le problème viendrait du fait que Unity essaie d'importer les nouvelles données pendant leur génération. Quand Unity n'est pas focus, alors il n'importe rien donc cela marche, le cas contraire, il importe en même temps et plante.
En cherchant un peu je suis tombé la dessus: AutoRefresh, qui devrait t'éviter l'import automatique. Essaie de le désactiver avant ton process puis de le réactiver.
Sinon, si tu peux lancer Unity en batch mode sans fenêtre (command line argument), il n'aura pas la main et n'importera rien.
"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

FabienTT
Messages : 67
Inscription : 06 Fév 2013 14:58

Re: [C#] Import de fichiers créés @runtime

Message par FabienTT » 03 Mars 2015 12:48

Salut Boubouk,

Merci pour ta réponse.
J'avais vu cette option, mais je pensais naïvement qu'il fallait que les fichiers soient "refresh" pour être lu @runtime dans Unity/Editor.

il semble que cela ne soit pas le cas.
Du coup, le problème ne vient pas de là. car là, il plante au bout de quelques fichiers.

J'appuies sur un bouton cela lance le processus suivant :

Code : Tout sélectionner

private IEnumerator StartProcess()
	{
		try
		{
			Process SimulationTool = new Process();
			SimulationTool.StartInfo.FileName = toolPath;
			SimulationTool.StartInfo.Arguments = "-i Simulation.xml";
			SimulationTool.Start();
			while(!SimulationTool.HasExited)
			{
				if(!SimulationTool.HasExited)
				{
					SimulationTool.Refresh();			
				} 
				yield return new WaitForSeconds(1);
			}
		}
		finally
		{
			UnityEngine.Debug.Log("Correcting files");
			
			if(CorrectFiles()) //retournes true quand c'est terminé. >> lance CorrectAllFiles()
			{
				UnityEngine.Debug.Log("Loading files"); //Charge tous les fichiers.
				LoadAllFiles();	
			}
		}
	}

Code : Tout sélectionner

	static public void CorrectAllFiles()
	{
		string[] files = new string[0];
		
		files = DataLoader.LoadFiles("Assets/Resources/Resources/Data/Unparsed/Vehicles");
		
		for(int i = 0; i < files.GetLength(0); i++)
		{
			Debug.Log (files[i]);
			DataLoader.CorrectorVehicles(Resources.Load("Data/Unparsed/Vehicles/" + files[i].Remove( files[i].Length - 4)) as TextAsset, files[i]); //<<< Plante durant l'execution de ce process.
		}

		files = DataLoader.LoadFiles("Assets/Resources/Resources/Data/Unparsed/Platforms");
		
		for(int i = 0; i < files.GetLength(0); i++)
		{
			//Debug.Log (files[i]);
			DataLoader.CorrectorPlatforms(Resources.Load("Data/Unparsed/Platforms/" + files[i].Remove( files[i].Length - 4)) as TextAsset, files[i]); //Load platforms
		}
	}

Code : Tout sélectionner

static public void CorrectorVehicles(TextAsset dataFile, string filename)
	{
		string output = "";
		string rowDelimiter = "\r\n";
		string colDelimiter = ",";
		Debug.Log (dataFile + "  " + filename);
		string[,] data = CSVReader.SplitCsvGrid(dataFile.text); //gather all the stations contained in the .CSV
               //LA LIGNE PRECEDENTE PLANTE AVEC : "object reference not set to an instance of an object"
               //mais pas dès le premier fichier, c'est "aléatoire", il peut y avoir 2 ou 3 fichiers qui ont été corrigés déjà.

	
               //le reste du code sert à mettre le format au propre pour qu'il soit lisible par le process "LoadAllFiles()".

		Debug.Log (data.GetLength (0));

		data [0, 0] = data [data.GetLength(0)-5, 1]; //Vehicle ID
		data [1, 0] = data [data.GetLength(0)-4, 1]; //Vehicle Capacity
		data [2, 0] = data [data.GetLength(0)-3, 1]; //Vehicle Line ID
		//data [3, 0] = data [data.GetLength(0)-3, 1]; //Vehicle Path Id.
		data [3, 0] = ""; //Emptying cell
		data [4, 0] = ""; //Emptying cell
		data [5, 0] = ""; //Emptying cell
		data [6, 0] = ""; //Emptying cell
		// Later we'll use a loop to clean thoses cells.

		for(int i = 0; i < data.GetLength(1)-2; i++){
			
			for(int j = 0; j < data.GetLength(0)-2; j++) {

				if(j >= data.GetLength(0)-5 && i > 0)
					data[j,i] ="";

				output = output + data[j,i] + colDelimiter ;
			}

			if(i < data.GetLength(1)-3)
				output = output + rowDelimiter;
		}

		CSVReader.SaveCSV("Assets/Resources/Resources/Data/Parsed/Vehicles/" + filename, output);
	}
La problématique vient clairement de l'automatisation, car si on fait la manip à la main : on simule d'un côté puis on CC les fichiers dans Unity.
Puis on fait correctallfiles avec un bouton.
Puis on fait loadallfiles avec un autre bouton.
Tout marche.

P.S: la classe CSVReader vient d'ici : http://wiki.unity3d.com/index.php?title=CSVReader

Si vous avez une idée/suggestion/solution... =)
Je continues de chercher de mon côté.

Merci en tout cas !

++
Fab.

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

Re: [C#] Import de fichiers créés @runtime

Message par boubouk50 » 03 Mars 2015 12:58

Si ça marche à la main et pas en automatisant, je dirai que l'ordre des scripts n'est pas respecté ou bien qu'une tache commence avant qu'une autre finisse.
Je testerai dans un premier temps avec de bons gros timer pour m'assurer que les tâches ne se superposent pas, et si cela fonctionne, je gérerai cela plus proprement avec des callbacks.
"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

sotec
Messages : 542
Inscription : 21 Sep 2012 10:11

Re: [C#] Import de fichiers créés @runtime

Message par sotec » 03 Mars 2015 13:01

yup, je rejoins boubouk50 sur les callback, des yield pour attendre la fin de l'execution de chaque script pour empécher la superposition.
┬─┬ノ(º - ºノ) - (╯°□°)╯︵ ┻━┻

FabienTT
Messages : 67
Inscription : 06 Fév 2013 14:58

Re: [C#] Import de fichiers créés @runtime

Message par FabienTT » 03 Mars 2015 13:14

En glissant un waitforseconds de 5 secondes avant correctallfiles() et un autre avant loadallfiles(), tout fonctionne.

Mais est-ce normal ?

FabienTT
Messages : 67
Inscription : 06 Fév 2013 14:58

Re: [C#] Import de fichiers créés @runtime

Message par FabienTT » 03 Mars 2015 13:19

Yop, je n'avais pas vu vos réponses, effectivement ; avec un un bon gros timer cela passe.

je ne connais pas les callback().
encore une aventure qui démarre !

Merci en tout cas pour votre aide, vous êtes les meilleurs.

FabienTT
Messages : 67
Inscription : 06 Fév 2013 14:58

Re: [C#] Import de fichiers créés @runtime

Message par FabienTT » 04 Mars 2015 16:31

Plop,

C'est à nouveau moi.

Je suis toujours confronté à mon problème.

Sans le refresh cela ne marche jamais, il me sort toujours l'erreur indiquée dans mon premier message. Il faut que je viennes faire refresh moi même à la main pour pouvoir ensuite passer à l'étape suivante.

Avec le refresh, si je reste focus sur la fenêtre unity, cela m'indique le message d'erreur. si je veux que cela se passe correctement, je profite du timer pour unfocus unity, puis le refocus (là il refresh). il CorrectAllFiles() et là, je dois unfocus Unity, puis refocus pour qu'il refresh. alors il LoadAllFiles() et je n'ai eu aucun message d'erreur.

Si je fais une build autant dire que rien ne fonctionne car il ne refresh jamais.
Du coup mon problème c'est cette saloperie de refresh et de metadonnées. Cela signifie que l'on ne peut pas manipuler (créer/supprimer) des données en temps réel avec Unity ?
Ou alors je suis un gros branquignol et je préférerais . =)

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

Re: [C#] Import de fichiers créés @runtime

Message par boubouk50 » 04 Mars 2015 16:53

Mais tu passes par l'Editor ou bien par le Game? Le build ne prend pas en compte l'Editor... et in-game, tu n'as pas d'import de données brutes.
"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

FabienTT
Messages : 67
Inscription : 06 Fév 2013 14:58

Re: [C#] Import de fichiers créés @runtime

Message par FabienTT » 04 Mars 2015 17:15

je suis pas certain de ce que tu désignes par le "game"/"ingame".

j'ai fais la majorité des essais sous l'éditeur @runtime, alors que l'application était lancée. là cela fonctionne uniquement quand je fais refresh (à la main ou en focus/unfocus) entre chaque phase (deux fois donc).

j'ai fais une build, mais là cela ne marche jamais.

Répondre

Revenir vers « (C#) CSharp »