高分显示意外值

时间:2017-05-29 11:55:49

标签: c# unity3d

我正在制作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.我犯了什么错误?

2 个答案:

答案 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有效地存储在纯文本中,这意味着用户可以破解他们的高分(如果他们愿意的话,除其他外。

但是根据问题,这是解决方案。