Page 1 sur 2

System.IO.DirectoryInfo.create()

Publié : 28 Avr 2015 21:09
par pilpo
Salut à tous, dites j'ai un petit problème avec cette fonction,

Je m'éxplique vite fait, je vous créer un systeme de sauvegardes qui va m'enregistrer des prefab ou autres dans un dossier, j'utilise donc la commande
System.IO.DirectoryInfo.create()
la dossier se crée bien, mais le problème c'est qu'il apparait uniquement une fois que j'arrete l'application, si je veux placer un prefab dans ce dossier il me mettra ne erreure je pense qu'il ne voit pas le dossier en runtime, y'a-t-il un genre de refresh à faire avant de placer les objets dans les dossiers ?

Code : Tout sélectionner


	void Savegame(){

		di = new System.IO.DirectoryInfo("Assets/Resources/Savegames/" + savename.text);
		if (di.Exists) 
		{
			 ////are u sure overwrite ?
		}
		else {	
			di.Create();
			UnityEditor.PrefabUtility.CreatePrefab(di.FullName + "bati.prefab" , batiments, UnityEditor.ReplacePrefabOptions.Default);

		}




	}




Re: System.IO.DirectoryInfo.create()

Publié : 29 Avr 2015 08:34
par sotec
je pense qu'en runtime, unity ne génère pas le fichier .meta qui sert à voir les ressources de ton projet, du coup ton dossier se créé bien mais n'est pas detecté, n'ayant jamais eu ce problème, je n'ai pas de solution sous la main , je laisse la solution aux autres membres ^^

Re: System.IO.DirectoryInfo.create()

Publié : 29 Avr 2015 20:23
par pilpo
Et ce fichier meta, y'a pas moyen de le créer ? mais effectivement ça a bien l'air d'être ça le problème, et c'est quoi ce fichier meta ? ça aide pour la structure du programme ?

Re: System.IO.DirectoryInfo.create()

Publié : 01 Mai 2015 15:54
par Montmorency
Alors bonjour,

Unity prend bien en compte le directory mais par contre tu fais plusieurs erreurs.

== > FAUX == "Assets/Resources/Savegames/" + savename.text

Attention à ça car une fois ton projet build ton dossier n'existe plus et unity ne le trouvera pas donc cré plutôt un dossier du type "Save" + savename.txt

Code : Tout sélectionner

if (Directory.Exists (@"Save")) {

} else {
   Directory.CreateDirectory (@"Save");
   File.WriteAllText("Save/NomDeLaSave.txt", "ContenueDeLaSave");
}
Ensuite tes prefab (enfin je crois) ne pour pas être exporter en dehors de l'instance unity.
Si non que veux tu faire avec ton prefab ? que veux tu modifier dessus ?

Re: System.IO.DirectoryInfo.create()

Publié : 01 Mai 2015 17:28
par pilpo
Salut et merci pour la réponse
Ouaip en fait y'a pas mal de truc que je comprend pas, ce @ correspond à quoi ? j'ai l'impression d'après ton code que c'est le répertoir d'installation du jeu grosso modo, mais si oui il se met dans quoi quand je suis dans l'éditeur ?

Donc ce projet à la base est jeu de gestion (un rctlike) pour l'instant j'ai créé un editeur de montagne russe, quelques manèges, un éditeur de routes avec pathfind, tout ceci vient se mettre dans un gameobject (enfin disons plutot repertoir...) ce que je voudrai c'est pour sauvegarder ce gameobject (comme un prefab) et qu'il soit considérer comme une sauvegarde.

ça marche trés bien dans l'éditeur avec pour créer le prefab :

Code : Tout sélectionner

		UnityEditor.PrefabUtility.CreatePrefab("Assets/Resources/Savegames/" + savename.text + ".prefab", batiments, UnityEditor.ReplacePrefabOptions.ReplaceNameBased);
et pour le charger

Code : Tout sélectionner

		Destroy(batiments);
		GameObject bat;
		bat = Instantiate(Resources.Load("Savegames/" + stringselect), transform.position, transform.rotation) as GameObject;
		bat.name = "batiments";
		batiments = bat;
c'est vraiment pil poil la fonction que je recherche sauf que ça ne sort pas de l'éditeur, impossible de build avec fonction unityeditor puis le recources.load comme précisé
en fait j'ai du mal à comprendre le raport entre les repertoirs assets et les vrais repertoirs du jeu

Re: System.IO.DirectoryInfo.create()

Publié : 01 Mai 2015 17:50
par Montmorency
Bonsoir,

Donc le @ correspond à mes souvenir pour signifier que ce qui suit est une adresse.

Dans l'editeur tu trouve ton dossier au même niveau que "Assets".
Je ne crois pas que tu puisse utiliser un prefab comme sauvegarde car tu ne peux pas enregistrer des prefab en dehors du dossier ressources.

Je pense plutot qu'il faut que tu cré un script pour enregistrer les position de tes préfab (pour ton jeu ou est situé ton rail) dans un fichier et ensuite tu sauvegarde juste les position et ensuite tu recharger ce fichier avec ces positions et les prefabs associé.

Pour build avec un script UnityEditor met #if UNITY_EDITOR et à la fin #endif normalement ça doit marcher tu poura build.

Re: System.IO.DirectoryInfo.create()

Publié : 01 Mai 2015 19:44
par pilpo
Merci beaucoup pour les infos je vais test ça

Sinon y'a pas un asset qui permettrait de faire ce genre de fonction ?
Parce que créer un script pour les positions de chaque objet c'est pas vraiment ça, faut que j'enregistre aussi les textures, les données en cours, y'a pas mal de spline avec des parametrages si elles sont connectées ou non, ça va etre un boulot de fou, alors que quand je vois que dans l'éditeur ça fait ce que je veu...

Re: System.IO.DirectoryInfo.create()

Publié : 01 Mai 2015 22:08
par yoyoyaya
pilpo a écrit :la dossier se crée bien, mais le problème c'est qu'il apparait uniquement une fois que j'arrete l'application, si je veux placer un prefab dans ce dossier il me mettra ne erreure je pense qu'il ne voit pas le dossier en runtime, y'a-t-il un genre de refresh à faire avant de placer les objets dans les dossiers ?
AssetDatabase.Refresh(); peut être ?
A appeler une fois le dossier créé pour le voir apparaitre dans la fenêtre "Project". Ça marche chez moi dans un de mes scripts pour l'editeur donc ça devrait aussi marcher dans ton cas. (en espérant ne pas répondre à coté de la plaque)

Re: System.IO.DirectoryInfo.create()

Publié : 01 Mai 2015 22:56
par Montmorency
Ce que tu demande est impossible !

Tu ne peux pas sauvegarder des préfabs en runtime, tu doit obligatoirement passer par des fichiers de sauvegarde.

Donc tu vas devoir revoir tout ton code pour enregistrer position / texture / données en cours / etc ...

Re: System.IO.DirectoryInfo.create()

Publié : 01 Mai 2015 23:50
par artemisart
Si tu veux sauvegarder tout un tas de variables/objets efficacement, regarde du côté de la serialization (et particulièrement UnitySerializer pour les GameObjects).