В этом уроке мы научимся реализовывать функциональность игры Сохранить / Загрузить в нашей игре. Мы начнем с сохранения необходимых данных, связанных с игроками, таких как уровень, на котором мы находимся, где мы находимся, и пример нашей учебной статистики.
Если вам нужен проект для тестирования, вы можете использовать проект в конце предыдущей статьи, посвященный сохранению данных между сценами, и он идеально подходит для изучения этого урока:
Скачать
Сохранение данных между сценами в Unity — предыдущая статья
[GitHub Repository]
[ZIP Скачать]
Если вы хотите скачать готовый проект, ссылка находится в конце этой статьи.
Разбивка концепции
Для сохранения внутриигровых данных на жестком диске в формате, который можно будет понять и загрузить позже, мы будем использовать функцию .NET / Mono, известную как сериализация. Вы можете узнать больше о теории сериализации по следующим ссылкам:
Короче говоря, «сериализация» означает запись объекта .NET на жесткий диск в его сыром двоичном виде. Это может звучать немного не интуитивно, но подумайте об этом так: мы сохраняем экземпляр класса на жесткий диск.
Возможно, вы помните, что, заканчивая наш последний пример, мы упаковали данные нашего игрока в один класс. Возможно, вы уже можете сказать, куда это идет. Давайте просто пройдемся по логике очень быстро:
Сохранение данных:
- Получить класс, содержащий данные игрока
- Сериализация на жесткий диск в известный файл
Загрузка данных:
- Найти известный файл сохранения
- Десериализовать содержимое в общий объект
- Привести объект в тип нашего класса данных
Что нам нужно сохранить?
- Все, что уже было в классе PlayerStatistics, которое было сохранено в разных сценах
- Идентификатор сцены, где была сохранена игра
- Место в сцене, где был игрок, когда игра была сохранена
Подготовка вещей
Используя проект из нашего предыдущего примера, нам нужно подготовить некоторые вещи, чтобы начать правильно писать эту функциональность. Нам необходимо рассмотреть следующие проблемы:
- На какой сцене был игрок, когда игра была сохранена?
- Где в сцене был игрок?
- Как мы инициализируем процедуру сохранения?
- Как мы инициализируем процедуру загрузки?
- Как мы узнаем, нужно ли нам начинать уровень заново или загружать существующие данные?
Предлагаемые решения:
Идентификация сцены? Добавление новой переменной Integer в класс пакета данных нашего проигрывателя, чтобы мы знали, на какой сцене был игрок.
Положение сцены? К сожалению, мы не можем добавить объект Transform или Vector3 в класс пакета данных Player, поскольку они не являются сериализуемыми объектами. Вместо этого нам нужно добавить три новых значения с плавающей точкой, обозначающие положение игрока X, Y и Z, и применить их к вектору положения игрока, когда мы загружаем данные.