保存计时器HighScore Unity C#

时间:2017-07-23 06:38:21

标签: c# unity3d timer save unityscript

我目前正在制作游戏,如果它有一个计时器,最好的时间是能够最快完成课程的那个。例如,第一次运行,如果我得到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 ();
     } 
}

3 个答案:

答案 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)