- Home /
Checking the value of null
Now, I know the title seems stupid, but hear (read, whatever) me out. I have a script that times how long it takes for the player to complete a level and saves it as a playerpref. However, to check whether or not the time of the last game was better than the best time, the script looks at the playerpref for the best time. The problem is, when you start the game, you have no high score, and checking the playerpref returns null, which then cannot be used to check whether or not the last game's time was faster than the best time. Here's the script (C#):
//Times games and saves the best times to their respective PlayerPrefs
using UnityEngine;
using System.Collections;
public class Timer : MonoBehaviour {
public static float Seconds = 0; //Seconds passed within this minute
public static int Minutes = 0; //Minutes passed
public static string RealTime; //The time in the form of X:YZ
public static float TimeCompare; //The value used to determine if this game's time is better than the previous
public static float LastTime1 = 0; //Fastest time values are zero by default
public static float LastTime2 = 0;
public static float LastTime3 = 0;
public static float LastTime4 = 0;
void Start() //Get the values for the best time of each level
{
LastTime1 = PlayerPrefs.GetFloat("LastTime1");
LastTime2 = PlayerPrefs.GetFloat("LastTime2");
LastTime3 = PlayerPrefs.GetFloat("LastTime3");
LastTime4 = PlayerPrefs.GetFloat("LastTime4");
Seconds = 0f; //Reset Seconds
Minutes = 0; //Reset Minutes
RealTime = null; //Reset RealTime
TimeCompare = 0; //Reset TimeCompare
}
// Update is called once per frame
void Update () {
Seconds = Time.timeSinceLevelLoad - Minutes*60;
if (Seconds >= 60)
{
Minutes += 1; //If 60 seconds have passed, add one to minutes
}
TimeCompare = Time.timeSinceLevelLoad;
RealTime = (Minutes.ToString() + ":" + Seconds.ToString("F0")); //Convert the Minute and Second variables into a readable value
Debug.Log(RealTime);
if (LoadLevel.GameOver == true)
{
if (LoadLevel.Level == 1 && TimeCompare > LastTime1)
{
PlayerPrefs.SetFloat("LastTime1", TimeCompare);
PlayerPrefs.SetString("Level1Time", RealTime);
PlayerPrefs.Save();
}
else if (LoadLevel.Level == 2 && TimeCompare > LastTime2)
{
PlayerPrefs.SetFloat("LastTime2", TimeCompare);
PlayerPrefs.SetString("Level2Time", RealTime);
PlayerPrefs.Save();
}
else if (LoadLevel.Level == 3 && TimeCompare > LastTime3)
{
PlayerPrefs.SetFloat("LastTime3", TimeCompare);
PlayerPrefs.SetString("Level3Time", RealTime);
PlayerPrefs.Save();
}
else if (LoadLevel.Level == 4 && TimeCompare > LastTime4)
{
PlayerPrefs.SetFloat("LastTime4", TimeCompare);
PlayerPrefs.SetString("Level4Time", RealTime);
PlayerPrefs.Save();
}
}
}
}
What is giving you null? GetFloat can't return null because it's returning a float which isn't nullable.
Answer by Ricewind1 · Jun 08, 2015 at 12:44 AM
Add a check that sees if Playerprefs is null or not. Just skip setting playerprefs or return null. Load and set playerprefs related fields in void Awake() or make playerprefs static and load playerprefs in its getter.
Example below:
public class ItemDatabase
{
public int DatabaseID = 0;
public Dictionary<String, Item> ItemList;
public ItemDatabase(int databaseID)
{
this.DatabaseID = databaseID;
ItemList = new Dictionary<String, Item>();
}
static ItemDatabase iDatabase;
public static ItemDatabase activeDatabase
{
get
{
if (iDatabase == null)
{
iDatabase = //Load database
}
return iDatabase;
}
}
public static Item FindByID(int itemID)
{
ItemDatabase db = activeDatabase;
db.GetItemByID(itemID);
}
private Item GetItemByID(int itemID)
{
return item;
}
Replace Itemdatabase with playerprefs. This will allow you to always call playerprefs from anywhere without a reference and handle the loading in playerprefs itself.
Answer by Taorcb · Jun 08, 2015 at 05:29 AM
Fixed it - the player press weren't saving because the script required TimeCompare to be greater than LastTime, which was set to zero in the declaration field (is that what that's called?).
Your answer

Follow this Question
Related Questions
How to I get the timer counter to restart when the player hits the ground and respawns? 2 Answers
How do I implement a timer into this script that will record the total time the player has played. 2 Answers
Timer Text doesn't show the time in the script. 1 Answer
Not sure what is wrong with my timer script. 1 Answer
Reload level after timer hits 0 1 Answer