System.IO.DirectoryInfo.create()

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
pilpo
Messages : 18
Inscription : 26 Nov 2014 16:01

System.IO.DirectoryInfo.create()

Message par pilpo » 28 Avr 2015 21:09

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);

		}




	}




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

Re: System.IO.DirectoryInfo.create()

Message par sotec » 29 Avr 2015 08:34

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 ^^
┬─┬ノ(º - ºノ) - (╯°□°)╯︵ ┻━┻

pilpo
Messages : 18
Inscription : 26 Nov 2014 16:01

Re: System.IO.DirectoryInfo.create()

Message par pilpo » 29 Avr 2015 20:23

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 ?

Avatar de l’utilisateur
Montmorency
Messages : 55
Inscription : 01 Mai 2015 15:28

Re: System.IO.DirectoryInfo.create()

Message par Montmorency » 01 Mai 2015 15:54

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 ?

pilpo
Messages : 18
Inscription : 26 Nov 2014 16:01

Re: System.IO.DirectoryInfo.create()

Message par pilpo » 01 Mai 2015 17:28

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

Avatar de l’utilisateur
Montmorency
Messages : 55
Inscription : 01 Mai 2015 15:28

Re: System.IO.DirectoryInfo.create()

Message par Montmorency » 01 Mai 2015 17:50

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.

pilpo
Messages : 18
Inscription : 26 Nov 2014 16:01

Re: System.IO.DirectoryInfo.create()

Message par pilpo » 01 Mai 2015 19:44

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...

Avatar de l’utilisateur
yoyoyaya
Messages : 1656
Inscription : 30 Mai 2011 13:14
Localisation : PAAAAARTOUUUU
Contact :

Re: System.IO.DirectoryInfo.create()

Message par yoyoyaya » 01 Mai 2015 22:08

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)
ImageImage

Avatar de l’utilisateur
Montmorency
Messages : 55
Inscription : 01 Mai 2015 15:28

Re: System.IO.DirectoryInfo.create()

Message par Montmorency » 01 Mai 2015 22:56

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 ...

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: System.IO.DirectoryInfo.create()

Message par artemisart » 01 Mai 2015 23:50

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).

Répondre

Revenir vers « (C#) CSharp »