Сохранение прогресса игрока в игре Unity

22

Я делаю игру, используя игровой движок Unity. Я хочу сохранить прогресс игрока, включая уровень, очки опыта, выбранного персонажа и т. Д. В настоящее время я пользуюсь playerprefs, но я хочу знать, будет ли это работать для геймеров, которые будут запускать эту игру на своих мобильных устройствах (Android / iOS) как настольные ПК (OSX / ПК)? Если нет, то как мне сохранить эту информацию? Я хочу автоматически сохранять прогресс игрока после очистки каждого этапа.

Шантану Сингх
источник

Ответы:

30

PlayerPrefs будет работать кроссплатформенно, но не рекомендуется для сохранения прогресса игры, потому что это небезопасно. Как обычный текстовый файл, игрок может легко открыть его и изменить содержимое на читерское, или заставить вашу игру вести себя непредсказуемо. Также не гарантировано, чтобы остаться.

PlayerPrefs предназначен для получения несущественной информации о предпочтениях, такой как сопоставление элементов управления или настройки музыки / sfx - вещи, которые игрок может свободно изменять в любом случае, и он не будет ужасно пропустить, если будет (в Windows, например) использовать точку восстановления системы и потеряет часть их регистрационной информации. Если это потеряло их высокие результаты или прогресс кампании, игроки были бы справедливо расстроены!

Вместо этого рекомендуется сохранять ход игрового процесса в своем собственном файле (обычно двоичном, возможно зашифрованном или подписанном, если вы хотите усложнить его изменение, но см. Комментарий Филиппа ниже).

Вы можете использовать Application.persistentDataPath, чтобы получить надежное местоположение для сохранения на каждой платформе. Обычно это папка с данными пользователя, которая не будет уничтожена в случаях, подобных примеру выше.

Если у вас есть путь для сохранения, вы можете использовать обычные методы ввода-вывода C # для создания, записи и чтения вашего файла. Детали будут сильно различаться в зависимости от формата и структуры сохраняемого файла, поэтому, если у вас возникнут проблемы, лучше задать новый вопрос с подробным описанием того, что вы пытаетесь сделать, и где вы застряли.

Д.М.Григорий
источник
30
На мой взгляд, шифрование и подписание файлов сохраненных игр - это просто snakeoil. Это небезопасно, потому что вы должны хранить ключи и алгоритмы в исполняемом файле игры, где опытный хакер может получить к ним доступ. Это также бессмысленно. Когда это одиночная игра: зачем? Пусть игрок наслаждается игрой так, как он хочет. Когда это многопользовательская игра, вам лучше сохранить все на сервере, где она защищена от манипуляций.
Филипп
5
@ SamedTarıkÇETİN Существует важное различие между путем к данным (местом, где установлена ​​ваша игра) и постоянным путем к данным (надежное место для сохранения новых данных). На некоторых платформах встроенная игра не может записывать в установленный путь к данным, поэтому в качестве общего правила рекомендуется сохранение в постоянном пути к данным.
DMGregory
2
Хотя я согласен с @Philipp в том, что хранилище на стороне клиента никогда не бывает по-настоящему безопасным и что во многих случаях нам не нужно жестко защищать однопользовательские игры, но степень защиты или обфускации в конечном итоге является выбором каждый создатель должен сделать для себя. С помощью этого ответа я просто хочу дать спрашивающему информацию, чтобы сделать осознанный выбор того, что подходит для их игры.
DMGregory
1
С одной стороны, я согласен с @Philipp, но я также видел / работал с сериализованным файлом сохранения, с которым было невозможно работать в текстовом редакторе. Да, я, вероятно, мог бы придумать, как войти и внести те или иные изменения, но так как файл выглядел как 2 мегабайта шестнадцатеричного числа, было бы довольно непросто разобраться. В таких случаях только самые несгибаемые люди будут пытаться разобрать его, и результаты будут специфичны для этой точки в игре (добавление еще одной единицы к сохранению выталкивает все последующие данные вниз по течению). Опять же, это не было предназначено для безопасности.
Draco18s
2
@ShantanuSingh, не храня их в PlayerPrefs. Такая информация должна храниться в удаленной базе данных и запрашиваться при запуске приложения. Для совместимости, когда интернет-соединение недоступно, используйте локальный защищенный сохраненный файл (то есть зашифрованный). Значения базы данных, если они доступны, должны перезаписывать локальные значения. В приложении могут быть плагины для покупок, которые обрабатывают вещи иным образом, но, скорее всего, они будут либо «требующимися в Интернете», либо взломанными (даже зашифрованный файл не безопасен на 100%), либо, как подробно говорится в этом комментарии.
Draco18s
-1

PlayerPrefs - это магазин K / V, разработанный для того, чтобы «просто работать» независимо от того, для какой платформы вы строите. Я говорю, просто продолжайте использовать это, если у вас нет веских причин не делать этого.

Гренландия
источник
Я думаю, что вопрос был в значительной степени, если есть веские причины не использовать PlayerPrefs (да, есть). Таким образом, я отклонил этот ответ, потому что он не отвечает на вопрос.
Питер - Унбан Роберт Харви
-1

Таким образом, наилучшим способом является сохранение на стороне сервера? Конвертируйте всю сохраненную необходимую информацию в строку json и сохраните ее на собственном сервере mysql в виде строковых данных, а когда потребуется загрузить, подключитесь к серверу и восстановите его?

создатель
источник
4
Это не ответ на вопрос. Если у вас есть вопрос, задайте как новый вопрос .
Сурав Павел