0
\$\begingroup\$

So I have this infinite runner type of game, subway surfers style. I chose a method where the player doesn't move, and instead the obstacles move towards him. My score is a float and it increases as time passes. However, I'm unable to figure out how can you save this as a highscore. I tried a few methods but most of them were for int so it didn't work out. Here is what I have for the score counting. It's currently missing the save score part completely.

 public class GameManagerC : MonoBehaviour { float score = 0; public float scoreMulti = 5; void Update() { if (isPlayerAlive == true) { score += Time.deltaTime * scoreMulti; scoreText.text = score.ToString("Score: 0"); } } 

EDIT: Many of you asked how I tried to implement the code I've found so here it is:

public float score; public float highScore; void Start() { score = PlayerPrefs.GetFloat("score"); highScore = PlayerPrefs.GetFloat("highScore"); if (score > highScore) highScore = score; StartGame(); } // Update is called once per frame void Update() { if (isPlayerAlive == true) { score += Time.deltaTime * scoreMulti; scoreText.text = score.ToString("Score: 0"); } } 
\$\endgroup\$
10
  • \$\begingroup\$ What did you try, specifically, and how did it go wrong? \$\endgroup\$ Commented Feb 4, 2021 at 19:25
  • \$\begingroup\$ Hi, 'Can I save a score ... if it's a float', I don't see why not? I wonder if you really need a float, but if you want an int (for example), you can just round it up (be generous to the player :P) to a whole number, after you calculate it with deltatime and such right? And while the game is running, you can calculate your score as float and show a rounded value to the player (don't store it as int or you may round-on/off a small amount each time). \$\endgroup\$ Commented Feb 4, 2021 at 19:44
  • \$\begingroup\$ Can we see the high score script that didn’t work? We can help fix it if we can see it. \$\endgroup\$ Commented Feb 4, 2021 at 19:51
  • \$\begingroup\$ Thanks for the fast reach out. I tried to modify this: forum.unity.com/threads/… Pretty much copied it and changed the runtime and best time into score and highscore \$\endgroup\$ Commented Feb 4, 2021 at 20:08
  • \$\begingroup\$ Include your code what you did and what it is doing wrong. \$\endgroup\$ Commented Feb 4, 2021 at 21:57

2 Answers 2

1
\$\begingroup\$

First, you will want to add public float highscore; with your other variables at the top. Then, you will want to change the old code to this in your script. This is a very basic save system, and can easily be modified to fit the needs of the game. The comments in the code explain the script in further detail.

void Update() { // Increases score if player is still alive if (isPlayerAlive == true) { score += Time.deltaTime * scoreMulti; scoreText.text = score.ToString("Score: 0"); // Changes highscore to current score if current score is higher if (score > highscore) { highscore = score; } } } // Saves the score when activated, from button, script, etc. void SaveScore() { PlayerPrefs.SetFloat("score", score); PlayerPrefs.SetFloat("highscore", highscore); PlayerPrefs.Save(); } // loads the score and highscore from the save file, if there are any void LoadScore() { score = PlayerPrefs.GetFloat("score", 0); highscore = PlayerPrefs.GetFloat("highscore", 0); } 
\$\endgroup\$
0
1
\$\begingroup\$

So I could succesfully implement a different method from this guy: https://answers.unity.com/questions/1378780/save-timer-highscore-1.html Thanks everyone for your patience and help! Currently this is able to save my highscore if I hit the restart button to reload my scene. If you stop playing and hit the play again however it resets to zero, so there's a chance this isn't what others are looking for.

Modified code:

public TextMeshProUGUI scoreText; public TextMeshProUGUI highScore; float score; // Start is called before the first frame update void Start() { StartGame(); highScore.text = PlayerPrefs.GetFloat("HighScore", 0).ToString(); } // Update is called once per frame void Update() { if (isPlayerAlive == true) { score += Time.deltaTime * scoreMulti; scoreText.text = score.ToString("Score: 0"); if (score > PlayerPrefs.GetFloat("HighScore", 0)) { PlayerPrefs.SetFloat("HighScore", score); highScore.text = score.ToString(); } } } 
\$\endgroup\$
0

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.