Maison >développement back-end >C++ >Comment puis-je gérer les modifications de sérialisation dans le système de sauvegarde/chargement d'Unity à l'aide de JSON ?

Comment puis-je gérer les modifications de sérialisation dans le système de sauvegarde/chargement d'Unity à l'aide de JSON ?

DDD
DDDoriginal
2025-01-04 22:50:41686parcourir

How Can I Handle Serialization Changes in Unity's Save/Load System Using JSON?

Gestion des modifications de sérialisation avec le système de sauvegarde/chargement de Unity

Malgré la commodité de la sérialisation de Unity, elle pose un défi lors de l'ajout de variables aux classes sérialisées . Ce problème se manifeste par des erreurs de désérialisation lors du chargement d'une ancienne version d'un fichier sérialisé, car la nouvelle variable n'existe pas.

Utilisation de JSON comme format intermédiaire

Pour Pour résoudre ce problème, nous pouvons exploiter JSON (JavaScript Object Notation) comme format de données intermédiaire. En convertissant la classe sérialisée en JSON avant de l'enregistrer et de la revenir en objet lors du chargement, nous pouvons éviter les erreurs de désérialisation causées par des variables manquantes.

Exemple de structure de classe

[Serializable]
public class Save
{
    public List<int> ID = new List<int>();
    public List<int> Amounts = new List<int>();
    public int extra = 0;
    public float highScore = 0;
}

Enregistrement des données avec JSON

void Save()
{
    Save saveData = new Save();
    saveData.extra = 99;
    saveData.highScore = 40;

    // Convert to JSON
    string jsonData = JsonUtility.ToJson(saveData);

    // Save JSON string
    PlayerPrefs.SetString("MySettings", jsonData);
    PlayerPrefs.Save();
}

Chargement des données avec JSON

void Load()
{
    // Load saved JSON
    string jsonData = PlayerPrefs.GetString("MySettings");

    // Convert to Class
    Save loadedData = JsonUtility.FromJson<Save>(jsonData);

    // Display saved data
    Debug.Log("Extra: " + loadedData.extra);
    Debug.Log("High Score: " + loadedData.highScore);

    for (int i = 0; i < loadedData.ID.Count; i++)
    {
        Debug.Log("ID: " + loadedData.ID[i]);
    }
    for (int i = 0; i < loadedData.Amounts.Count; i++)
    {
        Debug.Log("Amounts: " + loadedData.Amounts[i]);
    }
}

Différence entre JsonUtility.FromJson et JsonUtility.FromJsonOverwrite

  • JsonUtility.FromJson : Crée un nouveau objet de JSON et le renvoie, en allouant mémoire.
  • JsonUtility.FromJsonOverwrite : Écrase l'objet transmis par les données JSON, sans créer de nouveaux objets. Cela peut économiser de la mémoire et réduire l'utilisation du GC lors de transferts de données fréquents avec JSON.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn