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.
С наилучшими пожеланиями