我目前正在制作游戏,如果它有一个计时器,最好的时间是能够最快完成课程的那个。例如,第一次运行,如果我得到40秒将保存为高分,但如果第二次运行,我得到30秒,这将是新的高分。我的应用目前正好相反,如果我得到更高的时间,那将是新的高分。
注意:是的我尝试将标志切换为小于'(t< PlayerPrefs.GetFloat(“HighScore”,0))'但问题是没有时间可以击败“0”作为高分
源代码C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Internal;
public class TImer : MonoBehaviour {
public Text timerText;
public Text highscore;
private float startTime;
private bool finished = false;
void Start () {
startTime = Time.time;
highscore.text = PlayerPrefs.GetFloat ("HighScore", 0).ToString();
}
void Update ()
{
float t = Time.time - startTime;
string minutes = ((int)t / 60).ToString ();
string seconds = (t % 60).ToString ("f2");
timerText.text = minutes + ":" + seconds;
if (t > PlayerPrefs.GetFloat ("HighScore", 0)) {
PlayerPrefs.SetFloat ("HighScore", t);
highscore.text = t.ToString ();
}
}
答案 0 :(得分:4)
有一些问题。
第一,如果你想保存你需要做的最低的Peter Bons建议并使用float.MaxValue进行比较
第二,你在更新期间更新HighScore,它应该只在玩家完成游戏时更新。现在发生的是,你开始游戏时,HighScore在更新中被设置为0或接近0的东西。如果您将最低时间存储为HighScore,那将永远不会起作用,因为玩家达到了最高的" (或最好)在比赛开始时得分。
考虑到这一点,我在代码中做了一些更改。确保在玩家到达关卡/游戏结束时调用GameFinished()。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Internal;
public class TImer : MonoBehaviour {
public Text timerText;
public Text highscore;
private float startTime;
private bool finished = false;
void GameFinished()
{
float t = Time.time - startTime;
if (t < PlayerPrefs.GetFloat ("HighScore", float.MaxValue)) {
PlayerPrefs.SetFloat ("HighScore", t);
highscore.text = t.ToString ();
PlayerPrefs.Save();
}
}
void Start () {
startTime = Time.time;
highscore.text = PlayerPrefs.GetFloat ("HighScore", 0).ToString();
}
void Update ()
{
float t = Time.time - startTime;
string minutes = ((int)t / 60).ToString ();
string seconds = (t % 60).ToString ("f2");
timerText.text = minutes + ":" + seconds;
if(/* Check if player finished the game */)
GameFinished();
}
答案 1 :(得分:0)
所以,如果我没有弄错的话,高分表示最短的时间。在这种情况下,你应该检查游戏时间是否小于存储的高分,而不是你现在的比较。
是的,你确实写过你尝试了相反但是却永远无法击败0的高分(这是玩家第一次玩游戏时的默认值)。解决方案很简单:将默认高分设置为较大的数字:
if (t < PlayerPrefs.GetFloat("HighScore", float.MaxValue)) { //Checks HighScore or compare with max value
PlayerPrefs.SetFloat("HighScore", t);
highscore.text = t.ToString();
if (t < PlayerPrefs.GetFloat ("HighScore", float.MaxValue)) {
PlayerPrefs.SetFloat ("HighScore", t);
highscore.text = t.ToString ();
PlayerPrefs.Save();//Saves PlayerPrefs to save the HighScore that was changed
}
}
现在,第一次玩游戏总会带来新的高分。随后的比赛将与该高分进行比较。
答案 2 :(得分:0)
将if (t > PlayerPrefs.GetFloat ("HighScore", 0))
更改为if (t < PlayerPrefs.GetFloat("HighScore", 0) || PlayerPrefs.GetFloat("HighScore", 0) == 0)