Maison > développement back-end > C++ > Comment enregistrer et charger des données de jeu robustes dans Unity3d à l'aide de JSON et PlayerPrefs?

Comment enregistrer et charger des données de jeu robustes dans Unity3d à l'aide de JSON et PlayerPrefs?

DDD
Libérer: 2025-01-31 18:06:12
original
762 Les gens l'ont consulté

How to Robustly Save and Load Game Data in Unity3D using JSON and PlayerPrefs?

Méthode de préservation du statut de jeu Unity3d High-Efficacité

La méthode BinaryFormatter peut rencontrer des problèmes dans certains cas (en particulier sur les appareils iOS). Cela dépend de la correspondance des classes pendant Deepertine, il peut donc entraîner une perte de données après la mise à jour ou le remodelage. De plus, il doit ajouter des variables d'environnement à iOS pour éviter les problèmes.

Afin de résoudre ces restrictions et de fournir des solutions plus puissantes, il est recommandé d'utiliser PlayerPrefs et JSON pour enregistrer l'état du jeu. PlayerPrefs fournit un mécanisme pratique qui peut utiliser une petite quantité de données comme valeurs clés pour le stockage, et JSON (notation d'objet JavaScript) fournit un format structuré qui peut facilement le convertir en objets et le convertir des objets.

Cette méthode peut être encore améliorée en convertissant la chaîne JSON en tableau d'octets et en utilisant

et

pour lire et écrire des données. File.WriteAllBytes File.ReadAllBytes Ce qui suit est une démonstration générale de cette technologie.

Ce type d'utilisation est le suivant: DataSaver

public class DataSaver
{
    // 保存数据
    public static void SaveData<T>(T dataToSave, string dataFileName)
    {
        string path = Path.Combine(Application.persistentDataPath, dataFileName + ".json"); // 使用 Application.persistentDataPath  保证数据持久性

        string jsonData = JsonUtility.ToJson(dataToSave, true);
        byte[] jsonBytes = Encoding.UTF8.GetBytes(jsonData); // 使用 UTF8 编码

        Directory.CreateDirectory(Path.GetDirectoryName(path) ?? ""); // 创建目录,处理空路径

        try
        {
            File.WriteAllBytes(path, jsonBytes);
            Debug.Log("数据已保存到: " + path);
        }
        catch (Exception e)
        {
            Debug.LogError("保存数据失败: " + path + "\n错误信息: " + e.Message);
        }
    }

    // 加载数据
    public static T LoadData<T>(string dataFileName)
    {
        string path = Path.Combine(Application.persistentDataPath, dataFileName + ".json");

        if (!File.Exists(path))
        {
            Debug.Log("文件不存在: " + path);
            return default(T);
        }

        byte[] jsonBytes = null;
        try
        {
            jsonBytes = File.ReadAllBytes(path);
            Debug.Log("数据已加载自: " + path);
        }
        catch (Exception e)
        {
            Debug.LogError("加载数据失败: " + path + "\n错误信息: " + e.Message);
            return default(T);
        }

        string jsonData = Encoding.UTF8.GetString(jsonBytes); // 使用 UTF8 编码

        return JsonUtility.FromJson<T>(jsonData);
    }
}
Copier après la connexion
Cet exemple améliore le traitement des erreurs, utilise un type plus courant

et utilise

pour assurer la durabilité des données et corriger le problème de codage. N'oubliez pas d'ajouter des attributs
// 要保存的示例类
[Serializable]
public class PlayerInfo
{
    public List<int> IDs = new List<int>();
    public List<int> Amounts = new List<int>();
    public int Life = 0;
    public float HighScore = 0;
}

// 保存数据
PlayerInfo saveData = new PlayerInfo();
saveData.Life = 99;
saveData.HighScore = 40;
DataSaver.SaveData(saveData, "playerData");

// 加载数据
PlayerInfo loadedData = DataSaver.LoadData<PlayerInfo>("playerData");
if (loadedData != null)
{
    Debug.Log("生命值: " + loadedData.Life);
    Debug.Log("最高分: " + loadedData.HighScore);
}
Copier après la connexion
à votre classe .

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal