как создать рекорд в единстве? - PullRequest
0 голосов
/ 08 мая 2020

, поэтому я создал счет, который учитывает движение игрока

    using UnityEngine;
using UnityEngine.UI;

public class score : MonoBehaviour
{
    public Transform player;
    public Text scoreText;


    void Update()
    {

        scoreText.text =  player.position.z.ToString("0");
    }
}

, который работает нормально, но когда я попытался создать систему рекордов, сохраняющую и отображающую счет, он просто показывает ноль и не обновляется

    enter using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HighScore : MonoBehaviour
{
    public Text Score;
    public Text highscore;
    float highScore=0f;
    public Transform player;
     void Update()
    {

        Score.text = highScore.ToString();
        if(PlayerPrefs.GetFloat("Score",0)<=highScore)
        {
            PlayerPrefs.GetFloat("score", highScore);
            highscore.text = PlayerPrefs.GetFloat("score").ToString();
        }
    }
    public void highnumber()
    {
        highscore.text = PlayerPrefs.GetFloat("score").ToString();
    }

1 Ответ

1 голос
/ 08 мая 2020
public static class HighScore
{
    public Text Score;
    public Text highscore;
    float highScore=0f;
    public Transform player;
    void Update()
    {

        Score.text = highScore.ToString();
        //care here, "score" and "Score" it's not the same
        if(PlayerPrefs.GetFloat("score",0)<=highScore) 
        {
            //HERE YOU DONT WANT TO GetFloat, YOU WANT TO SET FLOAT
            //PlayerPrefs.GetFloat("score", highScore); we remove this lane
            PlayerPrefs.SetFloat("score", highScore); //we add this instead
            highscore.text = PlayerPrefs.GetFloat("score").ToString();
        }
    }
    public void highnumber()
    {
        highscore.text = PlayerPrefs.GetFloat("score").ToString();
    }
}

Подумайте о том, чтобы установить переменную с помощью PlayerPrefs.GetFloat ("score") вместо того, чтобы каждый раз вызывать GetFloat. Это более эффективно.

Также я сомневаюсь или, по крайней мере, думаю, что вам не следует прикреплять этот скрипт к gameObject ... поэтому удалите наследование MonoBehaviour из класса HighScore и сделайте его статичным c . Потому что вам нужен только экземпляр highScore? Если у вас есть какие-либо сомнения по поводу того, как это сделать, и вам интересно, просто скажите мне.

EDIT: Ну, как вы сказали, вам нужен моноповедение скрипта для управления текстом, хорошо. Давайте представим эти 2 класса так:

public static class Stats
{
    private static float _highScore; //your highscore it's here
    private static int _maxHp, _hp; //some example values
//...someMoreValues

    private static float _savedScore //this data gets the last score from PlayerPrefs
    private static bool _initialized; //this var is used to know if playerPref data is loaded

    //Calling this you always update your highscore
    public static void GetHighScore()
    {
        _InitializeScores();
        return _highScore;
    }

    //this calls playerprefs to save the highscore
    public static void SaveHighScore(){
        if(_savedScore < _highScore) //only if it's bigger than previuos one
        {
            _savedScore = _highScore; //we also update the savedscore we had from PlayerPrefs initialization
            PlayerPrefs.SetFloat("score", _highScore);
        }   
    } 

    //this loads your playerprefs values the 1st time it's called
    private static void _InitializeScores()
    {
        if (!_initialized) //if not initialized
        {
            _initialized = true;
            _savedScore= PlayerPrefs.GetFloat("score", 0f);
            _highScore = _savedScore
            //here you can add all the vars in a future you could recover from PlayerPrefs;
        }
    }
}

этот 1-й класс управляет вашим рекордом, а после текста у вас есть этот другой:

public class HighScoreTextController : MonoBehaviour
{
    //here you drag'n'drop your text script as always
    public Text score;
    // Start is called before the first frame update

    // Update is called once per frame
    void Update()
    {
        score.text = Stats.GetHighScore().ToString();
    }
}

Как видите, при обновлении вы вызовите Stats.highScore.ToString (). Вам не нужно создавать переменную с ее экземпляром, например

Stats stats = new Stats();

, потому что статистика равна c (нет экземпляров, только один для всей игры). GetHighScore позаботится о вызове PlayerPrefs в первый раз, когда вам нужно показать highScore, и предоставит вам все необходимое время.

Если вы хотите сохранить свой highScore, например, когда игра заканчивается, вы просто звоните

Stats.SaveHighScore();

И только если счет больше, он сохраняется ... Вызов PlayerPrefs, только один раз, чтобы получить данные, и только один раз, чтобы сохранить их, если необходимо.

И почему мы хотим использовать 2 скрипта вместо 1? Ну, потому что вы еще не знаете, но, возможно, в будущем вам нужно будет получить свой highScore с другого сайта ... А в другом месте вам нужно только вызвать Stats.GetHighScore (), потому что это stati c. И, возможно, в будущем вам нужно будет использовать PlayerPrefs для других значений ... ну, вы можете инициализировать все одновременно в своей статистике и использовать их всякий раз, когда вы sh.

С наилучшими пожеланиями

...