我正在制作2D自上而下的益智游戏。我很尴尬地保存了高分。我的游戏分数系统的工作原理如下:
当时间(秒)增加时, scoreCount
会减少。结果减少的scoreCount
将被添加到基本分数,该分数设置为100.如果score > highscore
,则该分数将被保存为高分。在我的情况下,高分应该在开始时为0。问题是,开头的高分显示随机数为3099(我尝试使用PlayerPrefs
重置PlayerPrefs.DeleteAll();
)。这是我的得分经理脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour {
public Text scoreText;
public Text BestScoreText;
private float score;
public float scoreCount;
public float pointsPerSecond;
// void start()
// {
//
//
// }
void Update () {
scoreCount += pointsPerSecond * Time.deltaTime;
score = 100;
}
void FixedUpdate() {
score = score + scoreCount;
scoreText.text = "Your Score : " + Mathf.Round (score);
BestScoreText.text = "Best Score : " + ((int)PlayerPrefs.GetFloat("BestScore"));
//PlayerPrefs.DeleteAll ();
if (score > PlayerPrefs.GetFloat ("BestScore")) {
PlayerPrefs.SetFloat ("BestScore", score);
}
}
}
另一件事:每当我增加scoreCount
时,默认的最佳分数就会增加。例如,如果我将其设置为10,则最佳分数显示为249; 100表示1699,200表示3099.我犯了什么错误?
答案 0 :(得分:0)
您应该再次在游戏开始时将所有内容设置为0
或"0"
。否则它会以你之前的设置开始。如果您在score > 0
时删除了PlayerPref。然后它会将PlayerPrefs设置为等于分数。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour {
public Text scoreText;
public Text BestScoreText;
private float score;
public float scoreCount;
public float pointsPerSecond;
void Start()
{
BestScoreText.text = "0";
scoreText.text = "0";
scoreCount = 0;
score = 0;
}
void Update () {
scoreCount += pointsPerSecond * Time.deltaTime;
score = 100;
}
void FixedUpdate() {
score = score + scoreCount;
scoreText.text = "Your Score : " + Mathf.Round (score);
BestScoreText.text = "Best Score : " + ((int)PlayerPrefs.GetFloat("BestScore"));
if (score > PlayerPrefs.GetFloat ("BestScore")) {
PlayerPrefs.SetFloat ("BestScore", score);
}
}
}
我认为这是解决方案,但我还没有对其进行测试,对不起,如果我错了。
答案 1 :(得分:0)
我怀疑FixedUpdate()
在两个Update()
帧之间被调用了两次,导致了不需要的值,因为它实际上会使实际得分翻倍(之前的得分值,加上自己再加上一些deltaTime) )。
我们可以通过使用 local 变量来修复它,而不是逐帧修改的变量。
void FixedUpdate() {
float scoreCheck = score + scoreCount;
scoreText.text = "Your Score : " + Mathf.Round (scoreCheck);
BestScoreText.text = "Best Score : " + ((int)PlayerPrefs.GetFloat("BestScore"));
//PlayerPrefs.DeleteAll ();
if (scoreCheck > PlayerPrefs.GetFloat ("BestScore")) {
PlayerPrefs.SetFloat ("BestScore", scoreCheck);
}
}
介意,我认为设计游戏还有比这更好的方法,因为现在没有什么可以防止分数低于0,PlayerPrefs有效地存储在纯文本中,这意味着用户可以破解他们的高分(如果他们愿意的话,除其他外。
但是根据问题,这是解决方案。