Сохранение данных в PlayerPrefs

Однажды мы написали игру, которой требовалось сохранять данные. И мы стали думать, куда же их сохранить. Варианты были такие: хранить в отдельном файле и обращаться через System.IO, но этот вариант плохо подходил для Web плеера, так как он не может обращаться к локальным файлам ОС. Следующий вариант был в сохранении фалов на сервере путем Get/Post запросов. Плюс в том, что все данные централизовано хранились бы в одном месте, но минус заставил нас отказаться от этого варианта — большинство данных были не критичными, т.е. они нужны только для самого игрока и, к примеру, если бы сервер (веб) был не доступен, то игрок потерял бы свою предыдущую игровую сессию( на время естественно). Поэтому мы продолжили поиски и, в итоге, нашли очень хорошее средство, которое предоставляет нам Unity3d. Это средство называется PlayerPrefs.

PlayerPrefs — это некое хранилище(на самом деле это класс для работы с ним, но для простоты назовем его хранилищем), в котором хранятся данные игровых сессий, которые записывает приложение. Для различных ОС и типов приложения место хранение различно: в Mac OS X PlayerPrefs хранится в ~/Library/Preferences; в Windows standalone players, PlayerPrefs хранится в регистре HKCU\Software\[company name]\[product name], где company и product names обозначается в Project Settings;
В Web players, PlayerPrefs хранится в binary files ~/Library/Preferences/Unity/WebPlayerPrefs для Mac OS X и %APPDATA%\Unity\WebPlayerPrefs для Windows.

Некоторые ограничения: один файл для одного адреса Web player и он не должен превышать 1 мб. Если лимит превышен, то методы SetInt, SetFloat и SetString не будут сохранять в хранилище данные и будет создаваться исключение типа PlayerPrefsException.

Теперь перейдем к процессу. Существуют следующие методы в классе PlayerPrefs:

SetInt — устанавливает целочисленное значение по ключу. Пример:
PlayerPrefs.SetInt("Money", 52);


GetInt — возвращает целочисленное значение по ключу. Пример:
int playerMoney = PlayerPrefs.GetInt("Money");


SetFloat — устанавливает вещественное значение по ключу.
PlayerPrefs.SetFloat("CurrentSpeed", 1.3f);


GetFloat — возвращает вещественное значение по ключу.
float playerSpeed = PlayerPrefs.GetFloat("CurrentSpeed");


SetString — устанавливает строку по ключу.
PlayerPrefs.SetString("Nick", "afrokick");


GetString — возвращает строку по ключу.
string playerNick = PlayerPrefs.GetString("Nick");


HasKey — возвращает true, если ключ существует в хранилище. Иначе false.
string playerNick = "Somebody";
if(PlayerPrefs.HasKey("Nick"))
                playerNick = PlayerPrefs.GetString("Nick");


DeleteKey — удаляет из хранилища значение по ключу.
PlayerPrefs.DeleteKey("Nick");


DeleteAll — очищает все хранилище.
PlayerPrefs.DeleteAll();


Save — сохраняет все данные в хранилище. По умолчанию, этот метод вызывается при Application Quit. Но по каким-либо причинам игра может закрыться, или зависнуть, и все данные будут утеряны. Поэтому следует вызывать этот метод каждый раз, когда нужно сохранить данные. Однако, не стоит вызывать этот метод, когда это не нужно, т.к. он нагружает приложение, и в достаточно живом игровом процессе могут замечаться лаги.
PlayerPrefs.Save();


Чуть-чуть комментариев. Ключ — это имя, под которым хранится значение(число, строка) в хранилище, Не забывайте об ограничениях.

Как работать? Очень просто.
1) Перед тем как получить значение по ключу проверьте, что этот ключ существует (с помощью HasKey)
2) После того, как вы записываете значения в хранилище (SetInt, SetFloat, SetString) не забывайте сохранять изменения (Save).

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.