2016-09-30 2 views
0

Я использую playerprefs для сохранения данных через сцены. Хотя у меня возникают проблемы с сохранением этих данных, когда приложение закрыто. Вы видите, что у меня есть магазин IAP, который дает игроку бумеранг, когда они его покупают, эффект бумеранга (сделанный внутри моего скрипта) активируется с помощью кнопки. Моя проблема в том, что playerprefs.haskey не сохраняет эффект бумеранга, когда я закрываю игру, а затем снова открываю ее. Хотя он сохраняет эффект бумеранга, когда он проходит через сцены. Это мой сценарий:Unity2D: PlayerPrefs.HasKey

public bool forceActive = false; 
public GameObject BoomerangOn, BoomerangOff; 
public static int buttonCount = 0; 
static int timesActivated = 0; 

void Start() 
{ 
    if (PlayerPrefs.HasKey ("boomerangbutton")) { 
     buttonCount = PlayerPrefs.GetInt ("boomerangbutton"); 
     BoomerangEffect(); 
    } 
} 

void Update() 
{ 
    PlayerPrefs.SetInt("boomerangbutton", buttonCount); 
} 

public void Activated() 
{ 
    if(timesActivated < BoomeerangText.score) 
    { 
     timesActivated++; 
     StartCoroutine(BoomerangEffect()); 
    } 
} 

IEnumerator BoomerangEffect() 
{ 

     BoomerangOn.SetActive (true); 
     yield return new WaitForSeconds (10.0f); 
     BoomerangOn.SetActive (false); 
     BoomerangOff.SetActive (true); 
     yield return new WaitForSeconds (1f); 
     BoomerangOff.SetActive (false); 
     forceActive = false; 
    } 

Второй Редактировать

Хорошо, я немного исследований и соединился эффект бумеранга скрипт с моим бумеранга текста сценария. Когда пользователь купит бумеранг из моего хранилища IAP, они получат 5 бумерангов, после нажатия на них текст бумеранга int войдет вниз (например, 5, 4, 3, 2 и 1), и так будет мой номер кнопки int (вот почему требуется время, требуемое). Однако изменить Активированную функцию:

public void Activated() 
    { 
    if (timesActivated < BoomeerangText.score) { 
      timesActivated++; 
      StartCoroutine (BoomerangEffect()); 
    } 
} 

До сих пор он работает в отношении активации моего обратного эффекта, когда приложение закрыто, но когда дело доходит до последнего междунара (1) ничего не происходит, мой эффект не принимает место, пока это моя единственная проблема. Выше обновленная версия того, как выглядит мой код сейчас. А ниже мой бумеранг текст сценария:

public static int score = 0;  // The player's score. 
public static int click = 1; 
public GameObject button; 


Text text;      // Reference to the Text component. 

// Use this for initialization 
void Start() 
{ 
    if (PlayerPrefs.HasKey ("boomerangTextInt")) { 
     score = PlayerPrefs.GetInt("boomerangTextInt"); 
    } 
} 

void Awake() 
{ 
    text = GetComponent<Text>(); 
} 

public void Update() 
{ 
    SetScoreText(); 
    PlayerPrefs.SetInt("boomerangTextInt", score); 
} 

void SetScoreText() 
{ 
    text.text = " " + score; 
    if (score <= 0) 
    { 
     text.text = "None"; 
     button.GetComponent<Button>().interactable = false; 
    } 
    else if (score >= 1) 
    { 
     button.GetComponent<Button>().interactable = true; 
    } 
    // Set the displayed text to be the word "Score" followed by the score value. 
} 
public void MinusBoomerangText() 
{ 
    score -= click; 
    text.text = " " + score; 
} 

}

И в моей покупки сценария у меня есть это:.

 public int scoreValue = 5; 

     if (String.Equals(args.purchasedProduct.definition.id, PRODUCT_5_BOOMERANG, StringComparison.Ordinal)) 
     { 
     BoomerangEffect.buttonCount += 5; 
      BoomerangText.score += scoreValue; 
      Debug.Log("Purchase successfull"); 
     } 

Спасибо :)

+0

Подобно тому, как наблюдение - возможно, вы должны только писать в свои «PlayerPrefs», когда изменяется данное значение, а не каждый вызов «Update()» (что кажется очень чрезмерным). – Serlite

ответ

0

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

Попробуйте следующее в вашей функции сохранения.

void Update() 
{ 
    PlayerPrefs.SetInt("boomerangbutton", buttonCount); 
    PlayerPrefs.Save(); 
} 

Отказ от ответственности: Я не утверждаю, это то, что вы должны сделать в вашем обновлении на всех, как это неэффективно, но это является основной причиной вашей проблемы

+0

Благодарим за предложение, однако оно не сработало. Однако я ценю вашу помощь. :) –

+0

Я даже попытался поставить 'PlayerPrefs.Save();' где-то еще в моем коде, но это не сработало –

+0

Имейте в виду, что вы сохраняете '' buttonCount'', который в настоящее время никогда не изменяется (в отсканированном фрагменте). '' timesActivated "', однако, изменен, но никогда не сохраняется. Вы уверены, что сохраните правильную переменную в соответствии с ожидаемым поведением? –

Смежные вопросы