保存计时器高分
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 > PlayerPrefs.GetFloat ("HighScore", 0))
更改为if (t < 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();
之前t
和PlayerPrefs.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)
?以上是关于保存计时器高分的主要内容,如果未能解决你的问题,请参考以下文章