保存计时器高分

Posted

技术标签:

【中文标题】保存计时器高分【英文标题】:Save Timer HighScore 【发布时间】:2017-07-23 06:38:21 【问题描述】:

我目前正在开发一款游戏,如果它有计时器,并且最好的时间是可以最快完成课程的时间。例如,第一次运行如果我得到 40 秒将被保存为高分,但如果第二次运行我得到 30 秒将是新的高分。我的应用程序目前的情况正好相反,如果我获得更高的时间,那将是新的高分。

注意:是的,我尝试将符号切换为小于 '(t

源代码 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 ();
      

【问题讨论】:

inside if statement insert "Debug.Log("Current time: " + t + " - 最高分:" + PlayerPrefs.GetFloat("HighScore", 0));"并在此处粘贴输出 当前时间:8.58746 - 最高分:8.58746 TIMEr:Update() 【参考方案1】:

有几个问题。

第一个如果你想保存最低值,你需要按照 Peter Bons 的建议做,并使用 float.MaxValue 进行比较

第二次你在更新过程中更新了高分,它应该只在玩家完成游戏时更新。现在发生的情况是,您开始游戏,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();

【讨论】:

【参考方案2】:

if (t &gt; PlayerPrefs.GetFloat ("HighScore", 0)) 更改为if (t &lt; PlayerPrefs.GetFloat("HighScore", 0) || PlayerPrefs.GetFloat("HighScore", 0) == 0)

【讨论】:

这会导致高分计时器停留在 0.02000000。【参考方案3】:

所以,如果我没记错的话,高分代表最短的时间。在这种情况下,您应该检查播放时间是否小于存储的高分,而不是大于您现在进行的比较。

是的,您确实写过您尝试了相反的方法,但是您永远无法击败 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
      

现在,第一次玩游戏总是会产生新的高分。随后的比赛将根据该高分进行评分。

【讨论】:

我已经尝试过你说的做,但是Highscore数字停留在0并且不动是怎么回事?不会根据您参加课程的时间而改变。似乎即使我将默认的高分数字设置为 float.MaxValue 它也保持在 0。 如果您使用我的更改进行调试,是否输入PlayerPrefs.SetFloat("HighScore", t); ,如果是,在调用highscore.text = t.ToString(); 之前tPlayerPrefs.GetFloat ("HighScore", 0) 的值是多少? 另外,在修改高分以保持更改后,您确实调用PlayerPrefs.Save()。见docs.unity3d.com/ScriptReference/PlayerPrefs.Save.html。因为如果你下次不这样做,PlayerPrefs.GetFloat ("HighScore", 0) 将再次为 0。 它在开始时将 HS 设置为 0 时运行 PlayerPrefs.GetFloat ("HighScore", 0)。虽然通过调试我发现它从不运行 if 语句中的任何函数。不运行此代码:PlayerPrefs.SetFloat ("HighScore", t); highscore.text = t.ToString (); 我不是 Unity 玩家,但这可能是因为 HighScore 已经有值了。你能以某种方式重置首选项吗?这样是你第一次运行游戏?如果没有,您可以一次(!)在开始时执行PlayerPrefs.SetFloat("HighScore", float.MaxValue)

以上是关于保存计时器高分的主要内容,如果未能解决你的问题,请参考以下文章

高分求一段 PHP 实时显示倒计时 代码

(转)C# Stopwatch详解

c#计时器如何保存计时

如何保存计时器中的时间,然后再继续?

保存计时器集合的最佳方法(对象与指针)

iPhone SDK - 如何在应用程序关闭和重新打开时保存和恢复计时器标签