Unity 2D: реализация PlayerPrefs для рекордов
Мне нужна помощь в реализации HighScore, который экономит. В настоящее время у меня есть счет, который начинается с 500 000 и падает до 150 очков в секунду. Это работает, хотя, когда я умираю, это все еще продолжается, что мне нужно исправить. У меня есть второй текст kmHighscore, и я хочу, чтобы он показал рекорд. Прямо сейчас он показывает точный счет, на котором я умер (например, 450 875), но когда я перезагружаю игру, я не могу ее сохранить. Я пытался с PlayerPrefs, но я не уверен, как применить его в моем коде. Я хочу, чтобы он представлял наименьшую, в данном случае, начиная с 500 000, оценку, когда-либо достигнутую. Просто чтобы заметить: kmScore и kmHighscore - это просто числа, у меня нет текста до счета или рекорда в окне Unity. Любая помощь будет оценена!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameOver : MonoBehaviour {
public GameObject gameOverScreen;
public Text kmScore;
public Text kmHighscore;
float savedScore;
bool gameOver;
private float score = 500000;
void Start () {
FindObjectOfType<PlayerController>().OnPlayerDeath += OnGameOver;
}
public void Update () {
kmScore.text = GetScore().ToString("F0");
if (gameOver)
{
if (Input.GetKeyDown (KeyCode.Space))
{
SceneManager.LoadScene(1);
}
}
}
float GetScore()
{
return score - (float)Time.timeSinceLevelLoad * 150;
}
void OnGameOver()
{
gameOverScreen.SetActive (true);
kmHighscore.text = GetScore().ToString("F0");
}
}
1 ответ
Вы должны изменить свой скрипт на это:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameOver : MonoBehaviour {
const string PLAYERPREFS_HIGHSCORE = "High Score";
const int STARTING_SCORE = 500000, POINTS_PER_SECOND = 150;
public GameObject gameOverScreen;
public Text kmScore, kmHighscore;
private int allTimeHighScore, actualScore;
private bool gameOver;
private void Start() {
allTimeHighScore = PlayerPrefs.GetInt(PLAYERPREFS_HIGHSCORE, STARTING_SCORE);
gameOver = false;
FindObjectOfType<PlayerController>().OnPlayerDeath += OnGameOver;
kmHighscore.text = allTimeHighScore.ToString("F0");
}
private void Update() {
if (gameOver) {
if (Input.GetKeyDown(KeyCode.Space)) {
SceneManager.LoadScene(1);
}
}
else {
kmScore.text = GetScore().ToString("F0");
}
}
private int GetScore() {
return actualScore = STARTING_SCORE - (int)Time.timeSinceLevelLoad * POINTS_PER_SECOND;
}
private void OnGameOver() {
gameOverScreen.SetActive(true);
if (allTimeHighScore > GetScore()) {
kmHighscore.text = (allTimeHighScore = actualScore).ToString("F0");
PlayerPrefs.SetInt(PLAYERPREFS_HIGHSCORE, allTimeHighScore);
}
gameOver = true;
}
}
Пара замечаний по поводу кода:
- Никогда не используйте так называемые "магические числа" внутри ваших скриптов, воспользуйтесь
const
переменные, если эти переменные являются неизменными. - Я добавил использование
gameOver
так как вы объявили это какprivate
и это не использовалось нигде в классе. Это остановит подсчет очков, когда он установлен наtrue
, - Изменен тип счета на
int
, который лучше подходит.