Есть несколько рекомендаций:
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();
}
}