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, который лучше подходит.
Другие вопросы по тегам