Comment sauver des données facilement sur Unity en JSON

Bonjour,

Je vais répondre ici à une question qu’on m’a posée plusieurs fois.
Comment faire pour sauver une grande quantité de données d’une session à l’autre ?

On peut utiliser les PlayersPrefs, ça fonctionne très bien, mais c’est assez limité.
Je vous propose ici de passer par des fichiers sauvés en local sur votre device.
(Ça fonctionne aussi bien sur PC, Mac, Android ou iOS)

Je vais donc créer une classe que je vais appeler MyClass


using System;
using System.IO;
using UnityEngine;

[System.Serializable]
public class MyClass
{
    public string titi;
    public int tata;
}

J’aimerais pouvoir la sauver et la charger facilement, par exemple en faisant :


// Save
MyClass myClass1 = new MyClass();
myClass1.titi = "hello";
myClass1.tata = 33;
myClass1.Save(filename);

// Load
MyClass myClass2 = new MyClass();
myClass2.Load(filename);

Pour cela, il faut que j’ajoute ces deux méthodes magiques :


public bool Save(string filename)
{
    try
    {
        string json = JsonUtility.ToJson(this);
        File.WriteAllText(filename, json);
        return true;
    }
    catch (Exception e)
    {
        Debug.LogError("Failed => " + e.ToString());
        return false;
    }
}

public bool Load(string filename)
{
    try
    {
        string json = File.ReadAllText(filename);
        JsonUtility.FromJsonOverwrite(json, this);
        return true;
    }
    catch (Exception e)
    {
        Debug.LogError("Failed => " + e.ToString());
        return false;
    }
}

ça permet de sauver directement la classe dans le fichier indiqué.

Comment choisir où sauver son fichier ? Et bien, je vous propose de le mettre dans Application.persistentDataPath, c’est le meilleur endroit persistant identifié par Unity.

Voici finalement la classe complète :


using System;
using System.IO;
using UnityEngine;

[System.Serializable]
public class MyClass
{
    // param to save
    public string titi;
    public int tata;

    public MyClass()
    {
        // do nothing here
    }

    public bool Save(string filename)
    {
        try
        {
            string json = JsonUtility.ToJson(this);
            File.WriteAllText(filename, json);
            return true;
        }
        catch (Exception e)
        {
            Debug.LogError("Failed => " + e.ToString());
            return false;
        }
    }

    public bool Load(string filename)
    {
        try
        {
            string json = File.ReadAllText(filename);
            JsonUtility.FromJsonOverwrite(json, this);
            return true;
        }
        catch (Exception e)
        {
            Debug.LogError("Failed => " + e.ToString());
            return false;
        }
    }
}

Et voici le fichier de test que j’ai utilisé :


using UnityEngine;

public class SaveMe : MonoBehaviour
{
    void Start()
    {
        Debug.Log("Application.persistentDataPath=" + Application.persistentDataPath);

        string filename = Application.persistentDataPath + "/test.json";

        // Save
        MyClass myClass1 = new MyClass();
        myClass1.titi = "hello";
        myClass1.tata = 33;
        myClass1.Save(filename);

        // Load
        MyClass myClass2 = new MyClass();
        myClass2.Load(filename);

        // Check values
        Debug.Log("myClass2.titi=" + myClass2.titi);
        Debug.Log("myClass2.tata=" + myClass2.tata);
    }
}

Voici à quoi ressemble le fichier sauvegardé :

{"titi":"hello","tata":33}

Pour info, la class MyClass peut contenir d’autre classes sérialisées ou des List d’objets sérialisés. C’est super pratique.
Attention, il faut que les membres soit marqués public ou [SerializeField] pour que ça fonctionne

Bonne journée à vous !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *