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

Для чего использовал JSON?

1.3 Junior🔥 231 комментариев
#Коллекции и структуры данных#Опыт и софт-скиллы

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

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

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

Обзор использования JSON в разработке на Unity

В контексте разработки игр на Unity я использовал JSON (JavaScript Object Notation) как один из ключевых форматов для сериализации данных, конфигурации игровых объектов и обмена информацией между клиентом и сервером. Этот легковесный текстовый формат стал незаменимым инструментом благодаря своей простоте, читаемости для человека и широкой поддержке в экосистеме Unity и C#. Вот основные области применения на практике:

1. Хранение и загрузка конфигураций и игровых данных

JSON идеально подходит для описания статических или настраиваемых параметров игры без перекомпиляции кода.

  • Настройки персонажей и врагов: Определение характеристик (здоровье, урон, скорость) для различных типов существ.
  • Конфигурация уровней: Описание расположения объектов, точек спавна, условий завершения миссии.
  • Локализация (i18n): Хранение словарей для поддержки нескольких языков в виде пар "ключ-перевод".

Пример структуры данных врага в JSON:

{
  "enemies": [
    {
      "id": "orc_warrior",
      "health": 150,
      "damage": 25,
      "speed": 3.5,
      "abilities": ["charge", "stun"],
      "lootTable": ["gold_coins", "orc_axe"]
    }
  ]
}

2. Сохранение и загрузка прогресса игры (Save/Load System)

Для реализации системы сохранений я часто сериализую состояние ключевых игровых объектов в JSON строку, которую затем сохраняю в PlayerPrefs, локальный файл или облачное хранилище.

  • Что сохраняется: Позиция игрока, инвентарь, пройденные квесты, статистика, настройки геймплея.
  • Преимущества: Формат легко отлаживать (можно открыть в любом текстовом редакторе) и модифицировать при необходимости, что критично во время разработки.

Пример класса для сериализации и его использования:

using UnityEngine;
using System.IO;
using Newtonsoft.Json; // Использую популярную библиотеку Newtonsoft.Json

[System.Serializable]
public class GameSaveData
{
    public Vector3Serializable playerPosition;
    public int playerHealth;
    public string[] inventoryItems;
}

public class SaveManager
{
    public void SaveGame(GameSaveData data)
    {
        string json = JsonConvert.SerializeObject(data, Formatting.Indented);
        File.WriteAllText(Application.persistentDataPath + "/save.json", json);
    }

    public GameSaveData LoadGame()
    {
        string path = Application.persistentDataPath + "/save.json";
        if (File.Exists(path))
        {
            string json = File.ReadAllText(path);
            return JsonConvert.DeserializeObject<GameSaveData>(json);
        }
        return null;
    }
}

3. Обмен данными в сетевых играх (API-запросы)

При работе с Backend-серверами или REST API (например, для рейтинговых таблиц, покупок в магазине, мультиплеера) JSON является стандартом де-факто для передачи структурированных данных.

  • Отправка: Сериализация объекта запроса (например, данные для аутентификации или результат уровня) в JSON и отправка через UnityWebRequest.
  • Получение: Десериализация ответа от сервера (например, список лидеров) в C# объекты для дальнейшего использования в игре.
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class APIManager : MonoBehaviour
{
    IEnumerator SendScore(string playerName, int score)
    {
        // 1. Создаем объект с данными
        var scoreData = new { name = playerName, score = score };
        string json = JsonUtility.ToJson(scoreData); // Используем встроенный JsonUtility

        // 2. Отправляем на сервер
        using (UnityWebRequest request = new UnityWebRequest("https://api.game.com/leaderboard", "POST"))
        {
            byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(json);
            request.uploadHandler = new UploadHandlerRaw(bodyRaw);
            request.downloadHandler = new DownloadHandlerBuffer();
            request.SetRequestHeader("Content-Type", "application/json");

            yield return request.SendWebRequest();

            // 3. Обрабатываем JSON-ответ
            if (request.result == UnityWebRequest.Result.Success)
            {
                LeaderboardResponse response = JsonUtility.FromJson<LeaderboardResponse>(request.downloadHandler.text);
                // Обновляем UI на основе response
            }
        }
    }
}

4. Интеграция с инструментами дизайнеров и редакторами

Для ускорения контент-производства я создавал инструменты внутри редактора Unity (Editor Tools), которые позволяли дизайнерам редактировать баланс или контент в таблицах (Excel/Google Sheets), а затем экспортировать их в JSON. Эти файлы автоматически загружались в игру, создавая готовые ScriptableObject или префабы.

Итог: Использование JSON в Unity — это практика, повышающая гибкость, скорость разработки и удобство сопровождения проекта. Он служит мостом между кодом, дизайном данных и внешними сервисами, позволяя эффективно управлять сложностью современных игр. Для работы с ним в C# я применяю как встроенный JsonUtility (для простых случаев), так и более мощную стороннюю библиотеку Newtonsoft.Json (для сложной сериализации, работы с полями свойств и словарями).