невозможно сбросить specfi c playerprefs в unity3d - PullRequest
0 голосов
/ 09 июля 2020
• 1000 не сработало так как сбросить таймер, когда игрок нажимает кнопку?

это 1-й код:

public int LastShownIntTime = 300;



void Start()
{
    #if UNITY_ANDROID
    Advertisement.Initialize(androidID);
     #endif
}
public void Update()
{

    LastShownIntTime = PlayerPrefs.GetInt("LastShownIntTime");

}     
public void showInterstitial()
{
    if (LastShownIntTime <=0)
    {
        showInterstitialwith5mint();
    }
}

public void showInterstitialwith5mint()
{
    Advertisement.Show("video");
    PlayerPrefs.SetInt("LastShownIntTime", 300);
}

и 2-й:

public float LastShownIntTimefloat;
 public int LastShownIntTime = 300;

void Start()
{
    LastShownIntTime = PlayerPrefs.GetInt("LastShownIntTime");
    LastShownIntTimefloat = LastShownIntTime;

}
public void Update()
{

    LastShownIntTimefloat -= Time.deltaTime;
    LastShownIntTime = (int)LastShownIntTimefloat;
    PlayerPrefs.SetInt("LastShownIntTime", LastShownIntTime);

}

}

1 Ответ

1 голос
/ 09 июля 2020

Основная проблема здесь:

Вам придется сбросить LastShownIntTimefloat в вашем script2!

В противном случае вы просто продолжите перезапись он с новыми значениями, уменьшающими значение еще больше, и записывает его обратно в PlayerPrefs

→ в следующий раз, когда ваш script1 опрашивает значение, которое оно не сбрасывается, но уже перезаписано script2 !

В общем: Вы не должны использовать PlayerPrefs, чтобы два компонента взаимодействовали!

В вашем случае здесь я бы даже не стал разделять logi c и беспокоиться с реализацией связи между ними, а объединяет их в один компонент.

Тогда нет необходимости читать и записывать PlayerPrefs каждый кадр , а только на определенных контрольных точках, таких как

  • Чтение один раз в Start
  • Запись один раз в OnApplicationQuit
  • Запись один раз в OnDestroy (это на случай, если вы, например, переключаете сцену, но не выходите из приложения)
  • Записывайте один раз каждый раз, когда ваш пользователь проигрывает (showInterstitial вызывается)
  • Запишите один раз при сбросе значения после показа рекламы

Я бы также просто использовал float и GetFloat и SetFloat вместо преобразования его из и в int.

public class MergedClass : MonoBehaviour
{
    // Rather sue a FLOAT for time!
    public float LastShownTime = 300;

    void Start()
    {
#if UNITY_ANDROID
        Advertisement.Initialize(androidID);
#endif

        // use 300 as default value if no PlayerPrefs found
        LastShownTime = PlayerPrefs.GetFloat("LastShownTime", 300f);
    }

    public void Update()
    {
        if(LastShownTime > 0f) LastShownTime -= Time.deltaTime;
    }     

    public void showInterstitial()
    {
        PlayerPrefs.SetFloat("LastShownTime", LastShownTime);
        PlayerPrefs.Save();

        if (LastShownTime <= 0f)
        {
            showInterstitialwith5mint();
        }
    }
    
    public void showInterstitialwith5mint()
    {
#if UNITY_ANDROID
        Advertisement.Show("video");
#else

        LastShownTime = 300f;
        PlayerPrefs.SetFloat("LastShownTime", LastShownTime); 
        PlayerPrefs.Save();
    }

    private void OnApplicationQuit()
    {
        PlayerPrefs.SetFloat("LastShownTime", LastShownTime);
        PlayerPrefs.Save();
    }

    private void OnDestroy()
    {
        PlayerPrefs.SetFloat("LastShownTime", LastShownTime);
        PlayerPrefs.Save();
    }
}
...