База по сохранением в Untiy

База по сохранением в Untiy

Введение

Система сохранений — неотъемлемая часть любой игры. В Unity существует несколько подходов к реализации сохранений. Разберём основные из них и посмотрим, в каких случаях стоит использовать тот или иной вариант.

1.PlayerPrefs

PlayerPrefs — встроенный механизм Unity для хранения простых типов данных по типу чисел или строк.

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

  • Настройки (звук, язык, графика)

  • Примитивные флаги типа "обучение пройдено"

Пример:

PlayerPrefs.SetInt("level", 5); PlayerPrefs.Save(); int level = PlayerPrefs.GetInt("level", 1);

Плюсы:

  • Максимально простой в использовании

  • Работает на всех платформах без дополнительной настройки

Минусы

  • Отсутствие защиты от взлома

  • Поддерживает только базовые типы данных

  • Непригоден для масштабных систем сохранений

2.JSON-файлы

Если вам нужно сохранить комплексные структуры данных (инвентарь, параметры персонажа, квесты), то подойдёт сериализация в JSON

Пример структуры данных

[System.Serializable] public class SaveData { public int level; public float health; public List<string> inventory; }

Само сохранение:

public void SaveGame() { SaveData data = new SaveData { level = 5, health = 87.5f, inventory = new List<string> { "sword", "potion" } }; string json = JsonUtility.ToJson(data); File.WriteAllText(Application.persistentDataPath + "/save.json", json); }

Загрузка в игру:

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

Плюсы:

  • Гибкость: сохраняем любые сериализуемые структуры

  • Удобство отладки и чтения содержимого

  • Хорошо подходит как для прототипов, так и для финального продукта


Минусы:

  • Работа с файловой системой требует дополнительных проверок

  • Поведение может отличаться на Android/iOS


3. ScriptableObject + JSON

ScriptableObject — инструмент Unity для хранения неизменяемых данных: характеристик предметов, врагов, способностей. Вместе с сериализацией можно организовать гибкую систему сохранений

Шаблон предмета:

[CreateAssetMenu(menuName = "Inventory/Item")] public class ItemData : ScriptableObject { public string itemId; public string itemName; public Sprite icon; public int maxStack; }

Инвентарь:

[System.Serializable] public class InventorySlot { public string itemId; public int quantity; } [System.Serializable] public class InventorySave { public List<InventorySlot> items; }

Сохранение:

public void SaveInventory(List<InventorySlot> inventory) { InventorySave saveData = new InventorySave { items = inventory }; string json = JsonUtility.ToJson(saveData); File.WriteAllText(Application.persistentDataPath + "/inventory.json", json); }

Загрузка:

public List<InventorySlot> LoadInventory() { string path = Application.persistentDataPath + "/inventory.json"; if (File.Exists(path)) { string json = File.ReadAllText(path); InventorySave saveData = JsonUtility.FromJson<InventorySave>(json); return saveData.items; } return new List<InventorySlot>(); }

Принцип работы:

  • ScriptableObject описывает неизменные параметры предмета

  • JSON хранит только ID и количество

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

Плюсы:

  • Упрощённая интеграция с UI и редактором

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

Минусы:

  • Требуется менеджер соответствий ID и объектов

  • Необходима система контроля целостности данных

"Я конечно всегда храню деньги моих клиентов, но от меня они ничего не получат"

Вика Податливая

Заключение

У каждого подхода свои сильные и слабые стороны. Простые проекты могут ограничиться PlayerPrefs, но для полноценных игр рекомендуется использовать JSON и ScriptableObject в связке.

8
3
Начать дискуссию