Практически в любой игре нужно сохранять данные:
- настройки
- прогресс игрока
- инвентарь
- статистику
- сохранения уровней
В 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 — удобство работы с конфигами
Главное — использовать их по назначению.