@George64

Скажите пожалуйста правильно я пользуюсь PlayerPrefs в Unity?

Вот скрипт сохранения:
{
        public int Money = 1;
        public void SaveGame() // При нажатии на кнопку
        {
            PlayerPrefs.Save();
        }
        void Start() 
        {
            PlayerPrefs.GetInt("money"); 
        }
        void Update()
        {
            PlayerPrefs.SetInt("money", Money);
        }
    }
  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Есть несколько рекомендаций:
1) Загрузка. В строке
PlayerPrefs.GetInt("money");
Вы загружаете данные из базы, но никуда не сохраняете. Нужно написать так:
Money = PlayerPrefs.GetInt("money");

2) Обновление. Обновлять данные, используя
void Update() {
	PlayerPrefs.SetInt("money", Money);
}

Но это всё равно, что если вы целый день за рулём, а ваш пассажир каждую секунду спрашивает "мы уже приехали?", "А теперь мы приехали?", "А теперь???".

Лучше данные сохранять тогда, когда они меняются. Например, добавим метод:
public void SetMoney(int money) {
	// Поменяли
	Money = money;
	// Сохранили
	PlayerPrefs.SetInt("money", Money);
}

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

3. Раз мы создали метод изменения денег, но у нас всё равно осталось публичное поле, то его стоит спрятать, чтобы случайно не вызвать логику изменения без сохранения в базу (вы же не хотите чтобы ваши игроки читерили, узнав о таком способе?). Потому делаем поле приватным и добавляем геттер:
private int Money;

// ...

public int GetMoney() {
	return Money;
}


4. Ваше поле Money имеет значение по умолчанию 1, но из базы загружается значение по умолчанию 0. Поэтому метод загрузки мы исправим вот так:
Money = PlayerPrefs.GetInt("money", 1);

В итоге получается такой код:
using UnityEngine;

public class MoneyScriptDemo : MonoBehaviour {

	private int Money = 1;

	private void Start() {
		Money = PlayerPrefs.GetInt("money", 1);
	}

	public void SetMoney(int money) {
		Money = money;
		PlayerPrefs.SetInt("money", Money);
	}

	public int GetMoney() {
		return Money;
	}

	public void SaveGame() {
		PlayerPrefs.Save();
	}
}


PS. Ну и так как мы не в Java, а в C#, то вместо геттера и сеттера можем написать аксессор:
using UnityEngine;

public class MoneyScriptDemo : MonoBehaviour {

	private int Money = 1;

	public int money {
		get => Money;
		set {
			Money = value;
			PlayerPrefs.SetInt("money", value);
		}
	}

	private void Start() {
		Money = PlayerPrefs.GetInt("money", 1);
	}

	public void SaveGame() {
		PlayerPrefs.Save();
	}
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы