- Unity Android — гайды для начинающих
- Поиск по этому блогу
- Unity Android — как хранить данные на устройстве
- Save data unity android
- Re: Сохранения для игр на телефон.
- Re: Сохранения для игр на телефон.
- Re: Сохранения для игр на телефон.
- Re: Сохранения для игр на телефон.
- Re: Сохранения для игр на телефон.
- Re: Сохранения для игр на телефон.
- Re: Сохранения для игр на телефон.
- Кто сейчас на конференции
- Каким способом сохранять игровые данные для Android/IOS?
- Сохранение игровых данных в Unity
- furry.cat
- Подготовка
- Простой способ: PlayerPrefs
- Сохранение
- Загрузка
- Сброс
- Недостатки
- Сложный способ: Сериализация
- Сохранение
- Загрузка
- Сброс
- Заключение
Unity Android — гайды для начинающих
Поиск по этому блогу
- Получить ссылку
- Электронная почта
- Другие приложения
Unity Android — как хранить данные на устройстве
- Получить ссылку
- Электронная почта
- Другие приложения
Для сохранения пользовательских данных необходимо использовать встроенные методы движка Unity. В этой статье мы рассмотрим самый простой способ их хранения.
Начнем с того, что в Unity есть синглтон PlayerPrefs, который реализует методы сохранения трех типов данных — строки, числа типа float и числа типа int.
Все данные сохраняются под ключами, как в словаре или ассоциативном массиве. Давайте рассмотрим это на примере кода.
Данная команда записала в словарь пользовательских данных число с типом int под ключом «name». Но просто прописать данную команду недостаточно: нужно подствердить сохранение. Для этого просто вызываем:
Вот пример сохранения других типов:
Чтобы получить значение, воспользуемся get методами:
string data = PlayerPrefs.GetString(«nickname»);
int number = PlayerPrefs.GetInt(«name»);
float money = PlayerPrefs.GetFloat(«money»);
Если до этой игровой сессии данные были занесены, методы вернут сохраненные значения.
Источник
Save data unity android
Fox_game 26 сен 2017, 13:07
Re: Сохранения для игр на телефон.
Alex_Hell 27 сен 2017, 01:18
Re: Сохранения для игр на телефон.
Fox_game 27 сен 2017, 11:19
Alex_Hell писал(а): 1й незащищенный — на мобилах пашет — крякабельный легко
https://docs.unity3d.com/ru/530/ScriptR . Prefs.html
Re: Сохранения для игр на телефон.
Pollux 27 сен 2017, 14:49
Re: Сохранения для игр на телефон.
Fox_game 28 сен 2017, 09:59
именно с этими палочками (\)? или с этими (/)
И где использовать Application.persistentDataPath?
я заменил на это:
Re: Сохранения для игр на телефон.
alt3d 28 сен 2017, 10:20
Вместо Application.dataPath используй Application.persistentDataPath
Юнити генерирует эту папку на телефоне по имени твоего приложения и изменяет права доступа так что ты можешь туда писать что хочешь.
И не надо городить огород с «sdcard0/Android/data/saves/save.zorya»
сразу пиши Application.persistentDataPath + «save.zorya»
Re: Сохранения для игр на телефон.
Fox_game 28 сен 2017, 18:56
alt3d писал(а): Вместо Application.dataPath используй Application.persistentDataPath
Юнити генерирует эту папку на телефоне по имени твоего приложения и изменяет права доступа так что ты можешь туда писать что хочешь.
И не надо городить огород с «sdcard0/Android/data/saves/save.zorya»
сразу пиши «Application.persistentDataPath/save.zorya»
Re: Сохранения для игр на телефон.
Tolking 28 сен 2017, 19:40
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Источник
Каким способом сохранять игровые данные для Android/IOS?
Создайте свою структуру классов/списков итд для сохранения мира из обычных C# классов с публичными свойствами и и публичными пустыми конструкторами. Сохраните все свои данные в эту структуру и сериализуйте в файл. Для сериализации выберите любой из предоставленных ассетов для бинарных форматов и скормите ему ваши классы/списки:
https://assetstore.unity.com/search?q=bson или
https://assetstore.unity.com/search?q=messagepack
Хотя на самом деле JSON местами компактнее BSON, и его тоже можно использовать. JSON.NET неплох. Если нужна мультиплатформа то вот JSON & MessagePack работает везде.
Для того что бы выбрать папку для сохранения можно воспользоваться следующим кодом:
Для создания файла в этой папке можно использовать следующий код:
Для непосредственного сохранения в файл с Json.NET:
Ну, и совет напоследок, не сохранять каждый раз в один и тот же файл, а делать это последовательно в разные файлы, на случай «битого» сохранения.
+вроде бы с File.CreateText могут быть проблемы на тех же андроидах, и рекомендуется через потоковые функции типа WWW (или что там вместо него уже) работать.
Ну и все же — лучше использовать PlayerPrefs. Аргумент — сам движок гарантирует, что запись в это хранилище на конкретной платформе доступна и работает. А ваш код надо будет обновлять при выходе каких нибудь новых ОСей с замороченной безопасностью.
Тут соглашусь, лучше писать туда куда юнити решила, но доступ в папку Personal есть везде, даже на WebGL. Файловая система там симулируется.
В остальном, перфоманс и мусор в памяти у сохранения на файловую систему и PlayerPrefs не соразмерны. Не в пользу последнего. Плюс были случаи когда PlayerPrefs затирались при апдейтах. И ни по поводу «возможных проблем», соглашаясь на юнити, ты соглашаешься что всё что угодно завтра отвалится. Если сегодня работает, то шикарно, завтра если что костылями обложим.
Источник
Сохранение игровых данных в Unity
furry.cat
Одна из самых важных вещей в игре – сохранение пользовательских данных: настроек и игровых результатов. Когда-то игры были короткими, и сохранять там было особенно нечего. В лучшем случае игра записывала самый высокий балл для составления рейтинга. Но технологии стремительно развивались, и геймдев не оставался в стороне.
Сейчас нам нужно хранить тонны данных, включая прогресс и статистику игрока. Эта потребность актуальна как для игр с огромным открытым миром, так и для простых линейных приключений. Зачастую требуется несколько сессий, чтобы завершить игру, значит, нужен способ сохраниться и вернуться позже к тому же моменту. Даже для простых коротких игр может быть полезно записывать какую-то информацию.
Подготовка
Unity предлагает сразу два способа сохранять игровые данные – попроще и посложнее:
- Попроще – встроенная система PlayerPrefs. Устанавливаете значение для ключа, нажимаете Save – и все готово.
- Посложнее – сериализация данных и запись в файл для дальнейшего использования.
У обоих методов есть преимущества и недостатки, поэтому для конкретного случая важно выбрать правильный вариант. Для демонстрации нам потребуется некоторая минимальная конфигурация. Создадим новый проект в Unity, за основу для простоты возьмем 2D-шаблон.
Создание нового проекта в Unity
Добавим два скрипта – SavePrefs и SaveSerial – для реализации двух методов.
Чтобы создать скрипт, кликните правой кнопкой мыши в окне Assets и выберите пункты Create -> C# Script .
Создание скрипта на C# в Unity
Начнем с более простого способа – SavePrefs .
Кликните два раза по скрипту, чтобы открыть его в редакторе Visual Studio.
Простой способ: PlayerPrefs
Для начала можно закомментировать или удалить методы Start и Update , так как они не потребуются для демонстрации сохранения данных. Затем нам понадобятся несколько переменных.
С помощью метода OnGui создадим пользовательский интерфейсдля визуального управления этими переменными.
- Две кнопки – для увеличения значений intToSave и floatToSave .
- Текстовое поле – для переменной stringToSave .
- Несколько лейблов для отображения текущих значений переменных.
- Три кнопки действий, чтобы сохранить, загрузить и сбросить данные.
Сохранение
Создадим метод SaveGame , который будет отвечать за сохранение данных:
Как видим, для сохранения данных с PlayerPrefs нужно лишь несколько строчек кода. Здесь мы устанавливаем ключи настройки ( «SavedInteger» или «SavedFloat» ) и их значения передаем в соответствующие методы объекта PlayerPrefs . После того, как все нужные данные записаны, сохраняем их, вызвав метод PlayerPrefs.Save . Выводим сообщение в отладочную консоль, о том, что операция успешно выполнена.
Должно быть, вам интересно, где сейчас физически находятся эти данные. Они записываются в файл в папке проекта. В Windows его можно найти по адресу HKEY_CURRENT_USER\Software\Unity\UnityEditor\[company name]\[project name] . Именно отсюда запускается игра из редактора. В exe-файле их можно найти по адресу HKEY_CURRENT_USER\Software\[company name]\[project name] . На Mac OS согласно документации файлы PlayerPrefs находятся в папке
/Library/Preferences , в файле с названием unity.[company name].[product name].plist .
Переменные PlayerPrefs в файловой системе Windows
Загрузка
Загрузка сохраненных данных – это, по сути, сохранение наоборот. Необходимо взять значения, хранящиеся в PlayerPrefs и записать их в переменные.
Хорошей практикой является предварительная проверка наличия нужных ключей. Для этого предназначен метод HasKey . Достаточно проверить хотя бы один ключ из установленных в методе SaveGame , чтобы понимать, есть ли у пользователя сохраненные данные.
Если данных нет, выведем в консоль сообщение об ошибке.
Сброс
Для удаления всех данных, хранящихся в PlayerPrefs , нужно использовать метод PlayerPrefs.DeleteAll .
В методе ResetData мы очищаем хранилище, а также обнуляем все переменные.
Теперь проверим весь этот код в деле. Сохраните файл и вернитесь в редактор Unity. Прикрепите скрипт SavePrefs к какому-нибудь объекту, например, к Main Camera .
Прикрепление скрипта SavePrefs
Теперь запустите игру и начните взаимодействовать с GUI-элементами. Изменяйте переменные, нажимая на кнопки и заполняя текстовое поле. Когда будете готовы, сохраните данные кнопкой Save Your Game . После этого остановите и перезапустите игру и нажмите на кнопку Load Your Game . Если вы всё сделали правильно, значения переменных немедленно изменятся на те, что вы сохранили в предыдущем запуске.
Чтобы очистить PlayerPrefs , кликните Reset Save Data .
Использование PlayerPrefs для сохранения данных. Скриншот работающего проекта
Недостатки
Этот способ кажется простым и эффективным. Почему бы всегда не использовать PlayerPrefs для сохранения пользовательских данных?
Из-за его невысокой безопасности. Вы точно не захотите сохранять таким способом данные, в которые не должен вмешиваться игрок: например, количество доступной игроку игровой валюты, или статистика.
Из названия понятно, что PlayerPrefs предназначен для хранения пользовательских предпочтений и других неигровых данных. Например, этот метод идеально подходит для записи настроек интерфейса: цветовой темы, размера элементов и т. п.
Другая проблема – в недостаточной гибкости. В PlayerPrefs вы можете сохранять только числа и строки, поэтому он не подходит для данных, имеющих сложную структуру.
К счастью, у нас есть еще один способ, более гибкий и безопасный.
Сложный способ: Сериализация
Для демонстрации сложного способа сохранения данных в Unity откроем скрипт SaveSerial .
Снова определим переменные и создадим интерфейс для управления ими. Метод OnGUI похож на тот, что мы только что писали:
Для сериализации данных потребуется добавить несколько директив using :
Сохранение
Создадим новый сериализуемый класс SaveData , который будет содержать сохраняемые данные.
Скрипт SaveSerial
Обратите внимание, три переменные в классе SaveData соответствуют переменным из класса SaveSerial . Для сохранения мы будем передавать значения из SaveSerial в SaveData , а затем сериализовать последний.
Добавим в класс SaveSerial метод SaveGame :
Объект BinaryFormatter предназначен для сериализации и десериализации. При сериализации он отвечает за преобразование информации в поток бинарных данных (нулей и единиц).
FileStream и File нужны для создания файла с расширением .dat . Константа Application.persistentDataPath содержит путь к файлам проекта: C:\Users\[user]\AppData\LocalLow\[company name] .
В методе SaveGame создается новый экземпляр класса SaveData . В него записываются текущие данные из SaveSerial , которые нужно сохранить. BinaryFormatter сериализует эти данные и записывает их в файл, созданный FileStream . Затем файл закрывается, в консоль выводится сообщение об успешном сохранении.
Загрузка
Метод LoadGame – это, как и раньше, SaveGame наоборот:
- Сначала ищем файл с сохраненными данными, который мы создали в методе SaveGame.
- Если он существует, открываем его и десериализуем с помощью BinaryFormatter .
- Передаем записанные в нем значения в переменные класса SaveSerial .
- Выводим в отладочную консоль сообщение об успешной загрузке.
Если файла с данными не окажется в папке проекта, выведем в консоль сообщение об ошибке.
Сброс
Наконец, реализуем метод для сброса сохранения. Он похож на тот ResetData , который мы написали для очистки PlayerPrefs , но включает в себя пару дополнительных шагов.
Сначала нужно убедиться, что файл, который мы хотим удалить, существует. После его удаления обнуляем значения переменных класса SaveSerial до дефолтных и выводим сообщение в консоль.
Если файла нет, выводим сообщение об ошибке.
Скрипт метода сериализации готов, теперь его можно проверить в деле. Сохраните код, вернитесь в Unity и запустите игру. Привяжите скрипт SaveSerial к объекту Main Camera (не забудьте деактивировать предыдущий).
Деактивация скрипта Save Prefs
После запуска вы увидите тот же самый интерфейс, что и раньше. Попробуйте изменить переменные и сохранить игру.
В этот раз файл будет сохранен по «постоянному пути данных» игры. В Windows это C:\Users\username\AppData\LocalLow\project name , в Mac –
/Library/Application Support/companyname/productname согласно документации.
Перезапустите игру и загрузите данные, нажав на кнопку Load Your Game . Значения переменных должны измениться на те, что вы сохранили ранее.
Также вы можете удалить все сохраненные данные кнопкой Reset Save Data .
Использование сериализации для сохранения данных. Скриншот работающего проекта
Заключение
Сохранение данных – важная часть большинства игр, за исключением лишь некоторых специфических исключений (например, игры с очень короткими игровыми сессиями или механикой перманентной смерти, в которой после каждого проигрыша вся игра сбрасывается к началу).
Помните о том, что PlayerPrefs – это простой способ сохранить настройки и предпочтения пользователя, но его не следует использовать для записи важных игровых данных.
Сериализация и запись в файл – более сложный путь, но он дает вам бóльшую гибкость и безопасность.
Какие именно данные сохранять и каким способом – зависит от особенностей проекта.
Источник