Unity: Как сохранить некоторые данные из игры и восстановить их при следующем запуске
В моей игре у меня есть предмет коллекционирования, и я хочу, чтобы каждый предмет коллекционирования не появлялся, если игрок уже собрал его и вернулся на сцену. Например, в одной сцене может быть около сотни таких предметов коллекционирования, и если игрок собирает одну из них, покидает сцену и затем возвращается, тот, который он собрал, не возрождается, а остальные делают.
После некоторого исследования я думаю, что должен использовать сериализацию данных, чтобы хранить, какие предметы коллекционирования были собраны, а какие нет, но я не уверен, как это сделать, и концепция для меня совершенно новая. Может ли кто-нибудь объяснить мне, что я должен делать, пожалуйста?
Спасибо
1 ответ
Используйте PlayerPrefs для хранения текущего состояния игрока.
Это варианты:
PlayerPrefs не поддерживает логическое значение, поэтому вы можете использовать целое число (0 - false и 1 - true) и назначать одно целое для каждого предмета коллекционирования. плюсы: проще в реализации. минусы: использует слишком много памяти, если количество хранимых объектов очень велико и требует больше нагрузки для чтения / записи.
присвойте одно целое число нескольким предметам коллекционирования, сохраните их поразрядно и конвертируйте туда-сюда. Плюсы: меньше памяти и более быстрое чтение / запись для большого количества хранимых объектов. cons: ограничивает количество каждого целого числа битами в int32. это 32.
назначить большую строку для всех предметов коллекционирования и конвертировать туда и обратно. Плюсы: вы можете хранить больше состояний, кроме true/false, также вы можете использовать любое шифрование для защиты данных от взлома. минусы: ничего не могу придумать.
Опция 1:
//store
PlayerPrefs.SetKey("collectible"+i, isCollected?1:0);
//fetch
isCollected = PlayerPrefs.GetKey("collectible"+i, 0) == 1;
побитовое:
int bits = 0;//note that collectiblesGroup1Count cannot be greater than 32
for(int i=0; i<collectiblesGroup1Count; i++)
if(collectibleGroup1[i].isCollected)
bits |= (1 << i);
//store
PlayerPrefs.SetKey("collectiblesGroup1", bits);
//fetch
bits = PlayerPrefs.GetKey("collectiblesGroup1", 0);//default value is 0
for(int i=0; i<collectiblesGroup1Count; i++)
collectibleGroup1[i].isCollected = (bits && (1 << i)) != 0;
струнный подход:
string bits = "";//consists of many C's and N's each for one collectible
for(int i=0; i<collectiblesCount; i++)
bits += collectibleGroup1[i].isCollected ? "C" : "N";
//store
PlayerPrefs.SetKey("collectibles", bits);
//fetch
bits = PlayerPrefs.GetKey("collectibles", "");
for(int i=0; i<collectiblesCount; i++)
if(i < bits.Length)
collectible[i].isCollected = bits[i] == "C";
else
collectible[i].isCollected = false;