Как правильно использовать PlayerPrefs в Unity, чтобы он работал корректно?

Здравствуйте! Я столкнулся с проблемой при написании кода для сохранений в Unity. Знаю, что для этого лучше использовать сериализацию, но пока что использую PlayerPrefs. Всё выглядит нормально, но сохранения не работают, и я не могу понять, в чем дело. Можете помочь мне решить эту проблему? Я уже три дня пытаюсь разобраться… <br/> <pre><code>public void SaveGame()
{
    x = _transform.position.x;
    y = _transform.position.y;
    z = _transform.position.z;
    PlayerPrefs.SetFloat("coffee", coffee_quantity);
    PlayerPrefs.SetFloat("chocolate", chocolate_quantity);
    PlayerPrefs.SetFloat("bread", bread_quantity);
    PlayerPrefs.SetFloat("meat", meat_quantity);
    PlayerPrefs.SetFloat("porridge", porridge_quantity);
    PlayerPrefs.SetFloat("crab", crab_quantity);
    PlayerPrefs.SetFloat("vessel", vessel_quantity);
    PlayerPrefs.SetFloat("water", water_quantity);
    PlayerPrefs.SetFloat("sweet", sweet_quantity);
    PlayerPrefs.SetFloat("antidarkness", antidarkness_quantity);
    PlayerPrefs.SetFloat("medic", medic_quantity);
    PlayerPrefs.SetFloat("angry", angry_quantity);
    PlayerPrefs.SetFloat("stoykost", stoykost_quantity);
    PlayerPrefs.SetFloat("otrava", otrava_quantity);
    PlayerPrefs.SetFloat("antiyad", antiyad_quantity);
    PlayerPrefs.SetFloat("oglushenie", oglushenie_quantity);
    PlayerPrefs.SetFloat("money", mo);
    PlayerPrefs.SetInt("scene", scene);
    PlayerPrefs.SetFloat("kong", kong_quantity);
    PlayerPrefs.SetFloat("dubinki", dubinki_quantity);
    PlayerPrefs.SetFloat("axe", axe_quantity);
    PlayerPrefs.SetFloat("alebarda", alebarda_quantity);
    PlayerPrefs.SetFloat("bulava", bulava_quantity)
  • 5 октября 2024 г. 19:24
Ответы на вопрос 2
Здравствуйте! Я с радостью помогу вам разобраться с использованием `PlayerPrefs` в Unity. Ваша функция для сохранения данных выглядит правильно, но вот несколько моментов, которые могут привести к тому, что сохранения не работают так, как вы ожидаете:

1. **Сохранение данных**: После установки значений с помощью `PlayerPrefs.SetFloat` и других методов, вам нужно вызвать `PlayerPrefs.Save()`, чтобы убедиться, что данные действительно сохраняются. Это особенно важно, если вы не выходите из приложения или если у вас есть нестабильное соединение с оборудованием.

   ```csharp
   PlayerPrefs.Save();
   ```

2. **Проверьте правильность данных**: Убедитесь, что все переменные, которые вы сохраняете (например, `coffee_quantity`, `chocolate_quantity` и т.д.), инициализированы и имеют значения, которые вы ожидаете сохранить. Если они равны нулю или неинициализированы, это приведет к тому, что в `PlayerPrefs` будут сохранены неверные данные.

3. **Загрузка данных**: Убедитесь, что вы правильно загружаете данные из `PlayerPrefs` в другой части вашего кода. Используйте `PlayerPrefs.GetFloat` и `PlayerPrefs.GetInt`, чтобы корректно получать сохраненные значения. Если вы не загружаете сохраненные данные после выхода из игры, вы не сможете их увидеть.

   Пример кода для загрузки:

   ```csharp
   public void LoadGame()
   {
       coffee_quantity = PlayerPrefs.GetFloat("coffee", 0);
       chocolate_quantity = PlayerPrefs.GetFloat("chocolate", 0);
       // ... и так далее для всех остальных переменных
   }
   ```

4. **Проверка наличия ключей**: Если вы пытаетесь получить данные, которых нет в `PlayerPrefs`, вы можете использовать второй параметр (по умолчанию), чтобы избежать получения значения по умолчанию вместо реального значения.

5. **Используйте правильные типы**: Убедитесь, что вы используете соответствующие методы для сохранения и получения данных (например, `SetFloat` для `GetFloat`, `SetInt` для `GetInt`, и так далее).

6. **Рабочий режим**: Если вы тестируете в редакторе Unity, данные также будут сохраняться там. После сборки проекта убедитесь, что вы можете сохранить и загрузить данные, когда приложение развернуто.

Пример окончательной версии вашей функции `SaveGame` может выглядеть так:

```csharp
public void SaveGame()
{
    PlayerPrefs.SetFloat("coffee", coffee_quantity);
    PlayerPrefs.SetFloat("chocolate", chocolate_quantity);
    // сохраняйте остальные переменные...
    PlayerPrefs.Save(); // Не забудьте сохранить изменения
}
```

Если вы учтете эти моменты, ваша функция сохранения должна работать корректно. Если проблема все еще не решена, пожалуйста, дайте больше информации о том, как вы используете `LoadGame`, и я постараюсь помочь еще больше.
Скрипт выглядит очень замудрено, но попробуй просто еще раз его переписать. На мой взгляд все правильно.
Похожие вопросы