- Home /
Playerprefs across Scenes
Hello everyone, I am using playerprefs to save a single variable. I have several factors affecting this variable across several scenes. For instance, in scene a, script a is modifying the variable, but in scene b, script b is also modifying the variable. However, for some reason, the variable does not save between scenes. Does anyone have any troubleshooting advice? My scripts are below: (sorry for them being so long. I thought giving more info was better than giving less. If you need anything else, let me know.) using System.Collections;
public class CarrotCount : MonoBehaviour
{
public float x;
public float y;
public float z;
public float unknown;
public int carrotnumber; // important
void Start ()
{
StartCoroutine (fiveseconds ());
carrotnumber = PlayerPrefs.GetInt ("carrotnumber", 10);
Debug.Log (carrotnumber);
}
// public void PLUS1 ()
// {
// Debug.Log ("Plus 1 carrot");
// carrotnumber += 1;
// Debug.Log (carrotnumber);
// PlayerPrefs.SetInt ("carrotnumber", carrotnumber);
//
// }
void OnGUI () {
GUI.Box (new Rect (x, y, z, unknown), "Carrots:"+ carrotnumber);
}
void Update ()
{
//PlayerPrefs.SetInt ("carrotnumber", carrotnumber);
// carrotnumber = PlayerPrefs.GetInt ("carrotnumber");
}
IEnumerator fiveseconds ()
{
yield return new WaitForSeconds (1) ;
PlayerPrefs.SetInt ("carrotnumber", carrotnumber);
PlayerPrefs.Save ();
Debug.Log (carrotnumber);
StartCoroutine (fiveseconds ());
}
}
script a:
using System;
using UnityEngine;
using UnityEngine.Advertisements;
public class test1 : MonoBehaviour {
public int xdist = 10;
public int ydis = 10;
public CarrotCount _carrotcount;
void Awake() {
if (Advertisement.isSupported) {
Advertisement.Initialize ("64925");
} else {
Debug.Log("Platform not supported");
}
}
void OnGUI() {
if(GUI.Button(new Rect(xdist, ydis, 85, 40), Advertisement.IsReady() ? "Free Carrots" : "Waiting...")) {
// Show with default zone, pause engine and print result to debug log
Advertisement.Show(null, new ShowOptions {
resultCallback = result => {
Debug.Log(result.ToString());
_carrotcount.carrotnumber += 5;
}
});
}
}
}
script b:
using UnityEngine;
using System.Collections;
public class Ifclicked : MonoBehaviour {
public MoveCarrot _MoveCarrot;
public CarrotCount _CarrotCount ;
public string use;
public killmole _killmole;
GameObject carrotmaster;
void Start ()
{
// carrotmaster = GameObject.Find ("carrotmaster");
// CarrotCount _CarrotCount = (CarrotCount) carrotmaster.GetComponent (typeof(CarrotCount));
}
void OnMouseDown ()
{
_MoveCarrot.move ();
_CarrotCount.carrotnumber += 1;
}
}
Once again, thank you for the help.
I realize my question is somewhat unclear. If you need more details on the situation, please let me know. Thank you, and good day.
first of all don't write to PlayerPrefs in Update, just do it whenever carrots change. I think that already solves the problem. I never had problems writing to PlayerPrefs
Debug your code a bit and print out carrotnumber in various functions to find out where the value changes or does not change.
Answer by danilom1111 · Feb 09, 2017 at 11:10 AM
Don't call .Save() every 5 seconds, and get rid of that loop its what makes it bad... you can just SetInt() and then use GetInt() to fetch value, you don't need to save it until you unload scene or quit play mode... And why do you have carrot counter script?
void OnGUI() {
if(GUI.Button(new Rect(xdist, ydis, 85, 40), Advertisement.IsReady() ? "Free Carrots" : "Waiting...")) {
// Show with default zone, pause engine and print result to debug log
Advertisement.Show(null, new ShowOptions {
resultCallback = result => {
int tmp = PlayerPrefs.GetInt("carrotnumber");
tmp+=5;
PlayerPrefs.SetInt("carrotnumber",tmp);
//Now you could save
PlayerPrefs.Save();
}
});
}
}
void OnMouseDown ()
{
_MoveCarrot.move ();
int tmp = PlayerPrefs.GetInt("carrotnumber");
tmp+=1;
PlayerPrefs.SetInt("carrotnumber",tmp);
}