24.05.2026

Сохранение данных в Unity: PlayerPrefs, JSON или ScriptableObject

Сравнение PlayerPrefs, JSON и ScriptableObject в Unity: как правильно сохранять данные в игре.

Сохранение данных в Unity: PlayerPrefs, JSON или ScriptableObject

Практически в любой игре нужно сохранять данные:

  • настройки
  • прогресс игрока
  • инвентарь
  • статистику
  • сохранения уровней

В Unity для этого существует несколько популярных подходов:

  • PlayerPrefs
  • JSON
  • ScriptableObject

У каждого варианта есть свои плюсы, минусы и сценарии использования.

В этой статье разберёмся, что и когда лучше применять.


PlayerPrefs

PlayerPrefs — самый простой способ хранения данных в Unity.

Он позволяет сохранять:

  • int
  • float
  • string

Пример:

PlayerPrefs.SetInt("Coins", 100);
PlayerPrefs.SetFloat("Volume", 0.8f);
PlayerPrefs.SetString("PlayerName", "Alex");

PlayerPrefs.Save();

Получение данных:

int coins = PlayerPrefs.GetInt("Coins", 0);

Плюсы PlayerPrefs

  • Очень просто использовать
  • Подходит новичкам
  • Отлично подходит для настроек


Минусы PlayerPrefs

  • Не подходит для сложных данных
  • Данные легко изменить вручную
  • Нет структуры
  • Плохая масштабируемость


Когда использовать PlayerPrefs

Подходит для:

  • громкости
  • графических настроек
  • языка игры
  • небольших числовых значений

Не стоит использовать для полноценной системы сохранений.


JSON-сохранения

JSON — один из самых популярных способов сохранения данных.

Суть простая:

  • объект переводится в JSON-строку
  • строка сохраняется в файл


Пример JSON-сохранения

Класс данных:

[System.Serializable]
public class SaveData
{
	public int coins;
	public int level;
	public float health;
}

Сохранение:

SaveData data = new SaveData();
data.coins = 150;
data.level = 3;
data.health = 75f;

string json = JsonUtility.ToJson(data);
System.IO.File.WriteAllText(path, json);

Загрузка:

string json = System.IO.File.ReadAllText(path);
SaveData data = JsonUtility.FromJson<SaveData>(json);

Плюсы JSON

  • Гибкость
  • Удобная структура
  • Подходит для сложных сохранений
  • Легко расширять


Минусы JSON

  • Нужно самостоятельно работать с файлами
  • Нет защиты данных
  • Можно случайно сломать совместимость сохранений


Когда использовать JSON

Подходит для:

  • RPG
  • survival-игр
  • сохранения прогресса
  • инвентаря
  • сложных игровых данных


ScriptableObject

ScriptableObject — это специальный тип объекта в Unity для хранения данных.

Главная идея:

  • данные существуют отдельно от сцены
  • их можно переиспользовать


Пример ScriptableObject

using UnityEngine;

[CreateAssetMenu(menuName = "Game/Player Config")]
public class PlayerConfig : ScriptableObject
{
	public int maxHealth;
	public float speed;
}

После этого можно создать asset прямо в Project.


Плюсы ScriptableObject

  • Удобно хранить конфиги
  • Отличная интеграция с Inspector
  • Переиспользование данных
  • Уменьшает дублирование


Минусы ScriptableObject

  • Не подходит для пользовательских сохранений
  • Не предназначен для runtime-save системы


Когда использовать ScriptableObject

Подходит для:

  • настроек оружия
  • конфигов персонажей
  • баланса
  • данных предметов
  • статических игровых данных

Частая ошибка новичков

Новички часто пытаются хранить всё в PlayerPrefs.

Это быстро приводит к:

  • хаосу
  • сложному коду
  • проблемам масштабирования

Лучше сразу разделять типы данных.


Практический подход

В реальных проектах обычно используют комбинацию:

  • PlayerPrefs → настройки
  • JSON → сохранения
  • ScriptableObject → игровые конфиги

Это наиболее удобная и масштабируемая схема.


Заключение

В Unity нет одного универсального способа хранения данных.

Каждый инструмент решает свою задачу:

  • PlayerPrefs — простота
  • JSON — гибкость
  • ScriptableObject — удобство работы с конфигами

Главное — использовать их по назначению.

Смотрите также

Dependency Injection в Unity (Zenject и VContainer)
30.05.2026

Dependency Injection в Unity (Zenject и VContainer)

По мере роста проекта код в Unity начинает усложняться. Скрипты становятся зависимыми друг от друга, появляется множество ссылок через Inspector, а изменения в одной системе неожиданно ломают другую. Именно для решения таких проблем используется Dependency Injection (DI). В этой статье разберём, что такое DI, зачем он нужен в Unity и какой инструмент выбрать: Zenject или VContainer.