Unity: Как сохранить некоторые данные из игры и восстановить их при следующем запуске

В моей игре у меня есть предмет коллекционирования, и я хочу, чтобы каждый предмет коллекционирования не появлялся, если игрок уже собрал его и вернулся на сцену. Например, в одной сцене может быть около сотни таких предметов коллекционирования, и если игрок собирает одну из них, покидает сцену и затем возвращается, тот, который он собрал, не возрождается, а остальные делают.

После некоторого исследования я думаю, что должен использовать сериализацию данных, чтобы хранить, какие предметы коллекционирования были собраны, а какие нет, но я не уверен, как это сделать, и концепция для меня совершенно новая. Может ли кто-нибудь объяснить мне, что я должен делать, пожалуйста?

Спасибо

1 ответ

Решение

Используйте PlayerPrefs для хранения текущего состояния игрока.

Это варианты:

  1. PlayerPrefs не поддерживает логическое значение, поэтому вы можете использовать целое число (0 - false и 1 - true) и назначать одно целое для каждого предмета коллекционирования. плюсы: проще в реализации. минусы: использует слишком много памяти, если количество хранимых объектов очень велико и требует больше нагрузки для чтения / записи.

  2. присвойте одно целое число нескольким предметам коллекционирования, сохраните их поразрядно и конвертируйте туда-сюда. Плюсы: меньше памяти и более быстрое чтение / запись для большого количества хранимых объектов. cons: ограничивает количество каждого целого числа битами в int32. это 32.

  3. назначить большую строку для всех предметов коллекционирования и конвертировать туда и обратно. Плюсы: вы можете хранить больше состояний, кроме 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;
Другие вопросы по тегам