Json dans Unity

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Maud3556
Messages : 4
Inscription : 23 Mars 2024 17:22

Json dans Unity

Message par Maud3556 » 16 Avr 2024 20:19

Bonjour à tous,
je souhaite sauvegarder les données des élèves d'une classe dans Unity en json.
Je parviens à sauvegarder les données d'un élève dans un fichier.
Le problème c'est que si j'ai plusieurs classes cela va faire un nombre énorme de fichiers...
Comment faire pour sauvegarder tous les élèves dans un seul fichier json ?

J'ai fait une classe élève:

Code : Tout sélectionner

[System.Serializable]
 public class Eleve
 {
    public string nom;
    public int score;
    public List<int> EssaisBloc1 = new List<int>();
    public List<int> EssaisBloc2= new List<int>();
    public List<int> EssaisBloc3 = new List<int>();
 }

J’essaie d'entrer des valeurs :

Code : Tout sélectionner

public void ClicBouton()
{
    eleve.EssaisBloc1.Add(5);
    string eleve1Data = JsonUtility.ToJson(eleve);
    string filePath = Application.persistentDataPath + "/eleve1.json";
    System.IO.File.WriteAllText(filePath, eleve1Data); 
}
et je sauvegarde le fichier:

Code : Tout sélectionner

public void SaveToJson(string fichier)
 {
     string groupe = JsonUtility.ToJson(classe);
     string filePath = Application.persistentDataPath + "/"+fichier+".json";
     System.IO.File.WriteAllText(filePath, groupe);
     print("sauvegarde effectuée");
 }

j'ai essayer de faire une classe "Groupe" liste d'élève mais ça ne me donne rien
[

Code : Tout sélectionner

System.Serializable]
public class Groupe
{
    public Eleve[] eleves;
}
ou

Code : Tout sélectionner

[System.Serializable]
public class Groupe
{
    public List<Eleve> eleve = new List<Eleve>();
}

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

Re: Json dans Unity

Message par boubouk50 » 17 Avr 2024 09:57

Il nous faudrait ton code entier pour suivre exactement ce que tu fais (par ex, classe sort de nulle part, je suppose que son type est Groupe). Là, comme ça, je ne vois pas le problème.
Inspire-toi de ce post :
https://www.unity3d-france.com/unity/ph ... on#p128899
"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

Maud3556
Messages : 4
Inscription : 23 Mars 2024 17:22

Re: Json dans Unity

Message par Maud3556 » 17 Avr 2024 10:52

Merci pour ta réponse,
je ne m'en sors toujours pas, je ne voit pas leur méthode de sauvegarde,
c'est ma sauvegarde qui n'est pas bonne,
j'obtiens un fichier json vide.

Dans Unity j'ai bien ma liste d'élèves :
Image

Je ne parviens pas à sauvegarder cette liste dans un fichier json
Pièces jointes
unity.png
unity.png (29.27 Kio) Consulté 466 fois

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

Re: Json dans Unity

Message par boubouk50 » 17 Avr 2024 12:26

Comment définis-tu ta variable classe ?
Ici, tu fais une sauvegarde de cette variable mais tu ne nous montres pas comment tu la remplis. Peut-être qu'elle est vide ?
Aussi, est-ce que le fichier est créé ? Est-il vide ? N'as-tu pas une erreur ?
"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

Maud3556
Messages : 4
Inscription : 23 Mars 2024 17:22

Re: Json dans Unity

Message par Maud3556 » 17 Avr 2024 13:46

Bonjour,

je n'ai pas d'erreur, mon fichier est créé mais vide.
mon but est simplement le sauvegarder la liste d'élèves.
J'ai créé la classe Groupe pour y placer la liste des élèves, je ne dois pas la remplir correctement et peut-être est-elle inutile s'il y a moyen de sauvegarder directement la liste d'élèves dans le fichier json...
Pour l'instant je ne parviens à sauvegarder qu'un éleve par fichier, je souhaiterais avoir tous les élèves dans un seul fichier

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

Re: Json dans Unity

Message par boubouk50 » 17 Avr 2024 14:21

C'est justement ce que je te demande.
Comment définis-tu ta variable classe ?
Ici, tu fais une sauvegarde de cette variable, mais tu ne nous montres pas comment tu la remplis. Peut-être qu'elle est vide ?
Donne ton code.
"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

Maud3556
Messages : 4
Inscription : 23 Mars 2024 17:22

Re: Json dans Unity

Message par Maud3556 » 17 Avr 2024 20:06

J'ai pas mal galéré tout l'après midi, mais tu m'a mis sur la voie et j'obtiens quelque chose qui à l'air de fonctionner.
Pas sur que ce soit très propre ni le plus efficace :

j'ai donc mes 2 classes :

Code : Tout sélectionner

 [System.Serializable]
  public class Eleve
  {
      public string nom;
      public int score;
      public List<int> EssaisBloc1 ;
      public List<int> EssaisBloc2;
      public List<int> EssaisBloc3 ;
  }

  [System.Serializable]
  public class Groupes
  {
      public List<Eleve> groupe ;
  }
et voilà mon code :

Code : Tout sélectionner

public class essai : MonoBehaviour
{
  
    public Groupes groupe = new Groupes();

    public void Start()
    {
        LoadGroupe("classe1");
    }
    
    //Test de modification d'un élève
    public void clicEleve(int num)
    { 
        string code = "nom" + num;
       groupe.groupe[num].nom = GameObject.Find(code).GetComponent<TMP_InputField>().text;
        SaveGroupe(groupe, "classe1");
    }

    // Méthode pour sauvegarder un groupe d'élèves en JSON
    public void SaveGroupe(Groupes groupe, string fichier)
    {
        string filePath = Application.persistentDataPath + "/" + fichier + ".json";

        string json = JsonUtility.ToJson(groupe);
        System.IO.File.WriteAllText(filePath, json);
    }

    //  Méthode pour charger un groupe d'élèves depuis un fichier JSON
    public void LoadGroupe(string fichier)
    {
        string filePath = Application.persistentDataPath + "/" + fichier + ".json";
        if (System.IO.File.Exists(filePath))
        {
            string json = System.IO.File.ReadAllText(filePath);
            groupe = JsonUtility.FromJson<Groupes>(json);
        }
        else
        {
            //creation du fichier
            for ( int i=0; i < 31; i++)
            {
                groupe.groupe.Add(new Eleve());
            }
            string sauv = JsonUtility.ToJson(groupe);
            System.IO.File.WriteAllText(filePath, sauv);

            //sauvegarde du fichier
            string json = System.IO.File.ReadAllText(filePath);
            groupe = JsonUtility.FromJson<Groupes>(json);
        }
    }
}
Pas sur que ce soit le plus efficace mais en tout cas ton aide m'a permis d'avancer, merci

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

Re: Json dans Unity

Message par boubouk50 » 18 Avr 2024 09:10

Il y a des choses à redire, c'est sûr, mais ça va dans l'ensemble, c'est fonctionnel.
Attention à la gestion d'exception (notamment dans ClicEleve ())
Et je n'ai pas compris le but de sauvegarder pour charger derrière.

Code : Tout sélectionner

// Pour t'éviter de l'écrire devant chaque fonction de ce namespace
using System.IO;

[System.Serializable]
public class Eleve
{
    public string nom;
    public int score;
    public List<int> EssaisBloc1;
    public List<int> EssaisBloc2;
    public List<int> EssaisBloc3;
}

[System.Serializable]
public class Groupes
{
    // C'est bizarre d'avoir une classe qui n'est qu'une liste d'élèves
    // Autant déclarer directement la liste dans essai...
    // ici tu as groupe.groupe[i], au lieu de groupe[i]
    public List<Eleve> groupe;
}

public class essai : MonoBehaviour
{
    // Pas très bon choix de nom -> tu vas avoir groupe.groupe à gérer, on peut se tromper de groupe
    public Groupes groupe = new Groupes ();

    public void Start ()
    {
	// Je suppose que c'est pour le test, mais un nom en dur est jamais une bonne idée
        LoadGroupe ("classe1");
    }

    // Test de modification d'un élève
    // J'ai mis un C majuscule, par convention une fonction commence par une Maj et les variables par une Min
    public void ClicEleve (int num)
    {
        // Attention, cela implique un nommage précis, c'est prone à erreur
        string code = "nom" + num;
        // Attention, cela implique que l'objet existe et qu'il a un component TMP_InputField sinon NullRefException
        // Attention, cela implique que groupe a été initialisé, et que groupe[num] existe
        groupe.groupe[num].nom = GameObject.Find (code).GetComponent<TMP_InputField> ().text;
	// Je suppose que c'est pour le test, mais un nom en dur est jamais une bonne idée
        SaveGroupe (groupe, "classe1");
    }

    // Méthode pour sauvegarder un groupe d'élèves en JSON
    public void SaveGroupe (Groupes groupe, string fichier)
    {
        // Filepath centralisé car demandé plusieurs fois dans la classe. Ici une proposition en une ligne, pour exemple
        File.WriteAllText (GetFilePath (fichier), JsonUtility.ToJson (groupe));
    }

    //  Méthode pour charger un groupe d'élèves depuis un fichier JSON
    public void LoadGroupe (string fichier)
    {
        // Centralisé car demandé plusieurs fois dans la classe
        string filePath = GetFilePath (fichier);

        if (File.Exists (filePath))
        {
            groupe = JsonUtility.FromJson<Groupes> (File.ReadAllText (filePath));
        }
        else
        {
            //creation du fichier
            // Attention, tu créeras toujours 31 élèves alors que peut-être en souhaites-tu un autre nombre ???
            // L'avantage des listes est de pouvoir ajuster sa taille comme tu le souhaites, donc ajouter ou supprimer un élément à tout moment
            for (int i = 0; i < 31; i++)
            {
                groupe.groupe.Add (new Eleve ());
            }
            // Pourquoi sauvegarder un groupe vide ?? -> Utiliser la fonction SaveGroupe
            // SaveGroupe (groupe, fichier);
            File.WriteAllText (filePath, JsonUtility.ToJson (groupe));

            // Pour ensuite le réinjecter ?? Puisque tu viens de le créer, il est déjà initialisé comme il faut.
            groupe = JsonUtility.FromJson<Groupes> (File.ReadAllText (filePath));
        }
    }

    /// <summary>
    /// Récupération d'un chemin complet d'un fichier avec extension
    /// </summary>
    /// <param name="_filename">le nom du fichier</param>
    /// <param name="_extension">l'extension du fichier (json par défaut)</param>
    /// <returns>le chemin d'accès au fichier depuis persistentData</returns>
    private string GetFilePath (string _filename, string _extension = "json")
    {
        // La classe File.IO permet la création de chemin sans le faire à la main
        // c'est plus propre et réutilisable pour d'autres fichiers (et d'autres extensions)
        // Si tu dois faire une modification, tu la fais une fois ici au lieu de changer partout dans ton code
        string filePath = Path.Combine (Application.persistentDataPath, _filename);
        // Si une extension existe, elle est remplacée, sinon elle est ajoutée (il n'existe pas de AddExtension ())
        Path.ChangeExtension (filePath, _extension);
        return filePath;
        // Tout ça équivaut à
        // return Application.persistentDataPath + "/" + fichier + ".json";
        // Mais en plus générique
    }
}
"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

Répondre

Revenir vers « Scripting »