Сохранение игры
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 31 из 64.
Сохранение игры — это один объект, записанный в формате JSON. Поместите всё необходимое для сохранения в класс [System.Serializable], заполните его данными из игры и запишите результат JsonUtility.ToJson в место, которое сохранится после завершения игры. В этом подземелье сохраняются этаж, золото и найденные ключи:
[System.Serializable]
public class DungeonSave
{
public int floor;
public int gold;
public List<string> keys;
}using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class Dungeon : MonoBehaviour
{
public int floor = 1;
public int gold;
public List<string> keys = new List<string>();
private string path;
void Start()
{
path = Path.Combine(Application.persistentDataPath, "dungeon.json");
if (File.Exists(path))
{
DungeonSave save = JsonUtility.FromJson<DungeonSave>(File.ReadAllText(path));
floor = save.floor;
gold = save.gold;
keys = save.keys;
}
}
public void Save()
{
DungeonSave save = new DungeonSave();
save.floor = floor;
save.gold = gold;
save.keys = keys;
File.WriteAllText(path, JsonUtility.ToJson(save));
}
}Application.persistentDataPath — это папка, которую Unity предоставляет игре на каждой платформе. Она сохраняется между запусками игры и после обновлений. Path.Combine объединяет этот путь с именем файла, используя разделитель, принятый на платформе. File.WriteAllText(path, text) записывает файл, заменяя старый; File.Exists проверяет, существует ли файл, а File.ReadAllText считывает его содержимое (все три метода — из System.IO). Папка самой игры может быть доступна только для чтения, поэтому сохранения нужно размещать в persistentDataPath и нигде больше. Создайте путь в Awake или Start: Unity не позволяет использовать persistentDataPath в инициализаторе поля.
Класс сохранения хранит только то, что необходимо сохранить, а игра копирует в него значения при сохранении и извлекает их из него при загрузке. Небольшое сохранение можно поместить в PlayerPrefs вместо файла: PlayerPrefs.SetString("dungeon", json) и PlayerPrefs.GetString("dungeon") хранят те же данные JSON. Сохраняйте игру, когда происходит важное событие, на контрольной точке или при нажатии кнопки сохранения: OnApplicationQuit выполняется при обычном выходе, но телефон может закрыть игру в фоновом режиме и не вызвать этот метод.
Задание
СреднеСохраните остров в island.json.
- В
IslandSave.csнапишите класс[System.Serializable]IslandSaveс полямиpublic Vector3 playerPosition;иpublic List<Vector3> flags;. - В
Start()задайте дляpathзначениеPath.Combine(Application.persistentDataPath, "island.json"). Save()записывает вpathв формате JSON объект IslandSave с даннымиtransform.positionиflags.Start()считывает существующий файл: восстанавливает позицию и вызываетPlantFlagдля каждого флага.
Нажмите «Играть», установите флаги, нажмите Save, остановите игру и снова нажмите «Играть»: флаги вернутся. Затем нажмите «Проверить».
Попробуйте сами
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;
public class Explorer : MonoBehaviour
{
public GameObject flagPrefab;
public float speed = 4f;
private List<Vector3> flags = new List<Vector3>();
private InputAction moveAction;
void Start()
{
moveAction = InputSystem.actions.FindAction("Move");
// Загрузите здесь island.json
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
transform.Translate(new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime);
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
PlantFlag(transform.position);
}
}
void PlantFlag(Vector3 position)
{
flags.Add(position);
Instantiate(flagPrefab, new Vector3(position.x, 0.5f, position.z), Quaternion.identity);
}
// Кнопка Save вызывает этот метод
public void Save()
{
// Запишите позицию игрока и флаги в island.json
}
}
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыКомпоненты работают вместеПовторение: модульная турельПовторение: спаренная пушка4Сериализованные данные
Сериализуемые классыСписки в инспектореПеречисления в инспектореПовторение: таблица добычиПовторение: определяем добычу2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействияПовторение: ближайший в пределах досягаемости5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиСохраняем ветерВолны как данныеПовторение: база предметовПовторение: покупка в магазинеПотренируйтесь самостоятельно: Песочница Unity