Лучший способ сохранить игровые данные в Unity, безопасный и независимый от платформы
Я ищу способ сохранить прогресс пользователей в моей игре, я ищу что-то, что не может быть изменено / изменено. Я хотел бы быть в состоянии быть независимым от платформы. И мне бы хотелось, чтобы в игре были сохранены файлы, чтобы пользователь мог передавать свои данные на разные компьютеры (с флешки или еще чего-то). (Поправьте меня, если я ошибаюсь в какой-либо области) Но я верю, потому что мне нужно быть защищенным и независимым от платформы, что убирает предпочтения игрока из уравнения. Я знаю, что есть способ сохранить данные, зашифровав их с помощью Binary, но я не знаю, как это работает и может ли пользователь передавать данные с компьютера на компьютер. Есть ли лучший способ сохранить данные? Является ли шифрование через Binary способом? Если так, как бы я это сделал? Спасибо:) Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать.
Редактировать: я понимаю, что ничто не является полностью безопасным, я ищу что-то, что может помешать среднестатистическому пользователю зайти в файл, изменить поплавок и иметь кучу денег в игре.
2 ответа
Первый способ сохранить данные в единстве - использовать PlayerPrefs, используя, например:
PlayerPrefs.SetString("key","value");
PlayerPrefs.SetFloat("key",0.0f);
PlayerPrefs.SetInt("key",0);
PlayerPrefs.Save();
и для получения вам нужно только
PlayerPrefs.GetString("key","default");
Второй способ и способ, позволяющий хранить вас в независимом файле, - это использовать сериализацию, я предпочитаю использовать для него файл json.
1) создайте класс, который будет хранить данные (необязательно, чтобы он расширял монобихи поведения:
[System.Serializable]
public class DataStorer {
public data1:String = "default value";
public data2:Int = 4;
public data3:bool = true;
....
}
и хранить его в другом классе с
DataStorer dataStorer = new DataStorer();
.... // some change in his data
string json = JsonUtility.ToJson(this, true);//true for you can read the file
path = Path.Combine(Application.persistantDataPath, "saved files", "data.json");
File.WriteAllText(path, json);
и для чтения данных
string json= File.ReadAllText(path);
DataStorer dataStorer = new DataStorer();
JsonUtility.FromJsonOverwrite(json, dataStorer);
и теперь вы dateStorer загружен с данными в вашем файле JSON.
В предыдущем ответе упоминаются два хороших метода хранения данных (хотя есть еще некоторые особенности при написании файлов на разных платформах), я хотел бы добавить к теме безопасности, как упомянуто в комментарии здесь.
Прежде всего, ничто не является полностью безопасным, всегда найдется кто-то более яркий, который найдет изъян в вашем коде, может быть, если вы не хотите использовать криптографию, что не является тривиальным с управлением ключами и т. Д.
Из вопроса я понимаю, что он хочет запретить пользователям перемещать файлы между компьютерами или разрешить им перемещать файлы между компьютерами, но запечатать их так, чтобы пользователи не могли легко изменять данные, хранящиеся на них.
В любом случае будет работать тривиальное решение: сгенерировать хеш-код из вашего набора данных, немного поработать с ним (подсолить или сделать что угодно, чтобы перейти к другому хеш-коду). чтобы вы могли иметь что-то вроде
{
"name"="john",
"score"="1234",
"protection"="043DA33C"
}
если поле 'protection' является хеш-кодом "john1234", оно не будет совпадать с "john9999", следовательно, если пользователь не знает, как вы защищаете свою защиту, вы сможете сказать, что сохранение было подделано
Я нашел ссылку на инструмент шифрования данных, который очень полезен в соответствии с вашими потребностями, поскольку вы хотите защитить данные на устройстве (ничего не защищено на 100%), есть 3 режима для защиты данных, приложение, устройство и ключ шифрования, вы можете выберите в соответствии с вашими потребностями.
См. Эту ссылку, это может вам помочь. https://forum.unity.com/threads/data-encryption-tool-on-assets-store.738299/