← Назад к вопросам

Как сохранить игру через JSON?

2.0 Middle🔥 201 комментариев
#Unity Core#Ресурсы и ассеты

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сохранение игры через JSON в Unity

Сохранение игрового прогресса через JSON (JavaScript Object Notation) — это популярный и эффективный подход благодаря его читаемости, простоте и поддержке в Unity. Вот подробное руководство по реализации.

1. Подготовка данных для сохранения

Сначала создайте класс, который будет представлять все сохраняемые данные. Используйте [System.Serializable] для сериализации, а также [System.NonSerialized] для исключения полей из сохранения.

[System.Serializable]
public class GameSaveData
{
    public string playerName;
    public int playerLevel;
    public float playerHealth;
    public Vector3 playerPosition;
    public List<string> inventoryItems;
    public DateTime lastSaveTime;

    [System.NonSerialized]
    public Texture2D playerIcon; // Не будет сохранено в JSON
}

2. Сериализация и десериализация

Unity предоставляет встроенный JsonUtility для работы с JSON. Для сложных структур (например, Dictionary или Vector3) могут потребоваться дополнительные преобразования.

using UnityEngine;
using System.IO;

public class JsonSaveSystem : MonoBehaviour
{
    private string savePath;

    private void Awake()
    {
        // Путь к файлу сохранения
        savePath = Path.Combine(Application.persistentDataPath, "savegame.json");
    }

    // Метод сохранения
    public void SaveGame(GameSaveData data)
    {
        // Сериализация в JSON
        string jsonData = JsonUtility.ToJson(data, true); // true для красивого форматирования
        
        // Запись в файл
        File.WriteAllText(savePath, jsonData);
        
        Debug.Log($"Игра сохранена по пути: {savePath}");
    }

    // Метод загрузки
    public GameSaveData LoadGame()
    {
        if (!File.Exists(savePath))
        {
            Debug.LogWarning("Файл сохранения не найден!");
            return null;
        }

        // Чтение из файла
        string jsonData = File.ReadAllText(savePath);
        
        // Десериализация из JSON
        GameSaveData loadedData = JsonUtility.FromJson<GameSaveData>(jsonData);
        
        Debug.Log("Игра успешно загружена!");
        return loadedData;
    }
}

3. Обработка сложных типов данных

JsonUtility не поддерживает напрямую некоторые типы Unity. Для них нужны обертки:

[System.Serializable]
public struct SerializableVector3
{
    public float x, y, z;
    
    public SerializableVector3(Vector3 vector)
    {
        x = vector.x;
        y = vector.y;
        z = vector.z;
    }
    
    public Vector3 ToVector3()
    {
        return new Vector3(x, y, z);
    }
}

// В основном классе сохранения
[System.Serializable]
public class AdvancedSaveData
{
    public SerializableVector3 playerPosition;
    public SerializableColor playerColor;
    
    // Конвертация при сохранении
    public void PrepareForSave(Vector3 position, Color color)
    {
        playerPosition = new SerializableVector3(position);
        playerColor = new SerializableColor(color);
    }
}

4. Практические рекомендации

  • Безопасность данных: Для защиты от редактирования файлов используйте шифрование или хеширование:
public string EncryptJson(string json)
{
    // Простое XOR-шифрование для примера
    char[] array = json.ToCharArray();
    for (int i = 0; i < array.Length; i++)
    {
        array[i] = (char)(array[i] ^ 0x6A); // Ключ шифрования
    }
    return new string(array);
}
  • Версионность: Добавляйте версию сохранения для обратной совместимости:
[System.Serializable]
public class VersionedSaveData
{
    public int saveVersion = 1;
    public GameSaveData gameData;
}
  • Асинхронное сохранение: Для больших объемов данных используйте асинхронные методы:
public async Task SaveGameAsync(GameSaveData data)
{
    string jsonData = JsonUtility.ToJson(data);
    await File.WriteAllTextAsync(savePath, jsonData);
}

5. Альтернативные библиотеки

Для сложных случаев рассмотрите Newtonsoft.Json (JSON.NET):

  • Поддержка словарей, полиморфизма
  • Более гибкие настройки сериализации
  • Требует установки через Package Manager

Ключевые преимущества JSON:

  • Человекочитаемый формат для отладки
  • Быстрая сериализация/десериализация
  • Широкая поддержка в различных системах
  • Гибкость через кастомные конвертеры

Основные ограничения:

  • Отсутствие встроенной поддержки некоторых типов Unity
  • Меньшая производительность по сравнению с бинарными форматами
  • Больший размер файлов (можно компенсировать сжатием)

Для большинства игровых проектов JsonUtility предоставляет оптимальный баланс между простотой использования и производительностью. Для сложных MMO-проектов или при работе с большими объемами данных стоит рассмотреть бинарные форматы или специализированные решения.