【问题标题】:PlayerPrefs not working on androidPlayerPrefs 无法在 Android 上运行
【发布时间】:2018-02-27 23:47:22
【问题描述】:

我设法在我的 Android 应用中添加了一个分数和一个高分计数器。一切都很好,在 Unity 中运行良好。我构建了我的应用程序并想在我的手机上对其进行测试,但是使用 PlayerPrefs 保存的高分计数器不会显示...有很多方法,但没有任何效果:(有什么想法吗?

这是我的代码

 public class Score : MonoBehaviour {
 public Transform Charakter;
 public Text scoreText;
 public Text HighscoreText;

 public void Start()
 {
     HighscoreText.text = PlayerPrefs.GetString("HighScore");
     PlayerPrefs.Save();
 }

 private void Update()
 {
     scoreText.text = Charakter.position.x.ToString("0");

     int score = int.Parse(scoreText.text);
     int highscore = int.Parse(PlayerPrefs.GetString("HighScore"));

     if (score > highscore)
     {
         PlayerPrefs.SetString("HighScore", scoreText.text);
         PlayerPrefs.Save();
     }
 }

}

【问题讨论】:

    标签: c# android unity3d save unity5


    【解决方案1】:

    您在没有默认值的情况下调用PlayerPrefs.GetString("HighScore"),因此如果尚未保存高分,它将返回""。由于您在保存之前检索了高分,因此您可能遇到了FormatException: Input string was not in a correct format. 异常,因为它正在将“”返回给无效输入的int.Parse() 调用。您应该将该行切换到

    int highscore = int.Parse(PlayerPrefs.GetString("HighScore", "0"));
    

    更好的是,将所有内容存储为 int 并将 int 转换为文本字符串,这样更安全。在本地跟踪分数和高分,这样您就不必每帧都从 playerprefs 中检索高分!

    public class Score : MonoBehaviour
    {
        public Transform Charakter;
        public Text scoreText;
        public Text HighscoreText;
    
        private int Score;
        private int HighScore;
    
        public void Start()
        {
            HighScore = PlayerPrefs.GetInt("HighScore", 0);
            HighScoreText.text = HighScore.ToString();
        }
    
        private void Update()
        {
            Score = Mathf.FloorToInt(Charakter.position.x);
            scoreText.text = Score.ToString();
    
            if (Score > HighScore)
            {
                HighScore = Score;
                HighScoreText.text = HighScore.ToString();
                PlayerPrefs.SetInt("HighScore", HighScore);
                PlayerPrefs.Save();
            }
        }
    }
    

    【讨论】:

    • 感谢您的帮助,但它并没有保存高分。它只显示当前分数。我试图解决它但没有:/你有什么想法吗?
    • 您是否在编辑器中验证了此功能,并且仅在 Android 上失败?另外,当您说“仅显示当前分数”时,显示是什么意思?文本元素?如果是这种情况,HighScoreText.text = HighScore.ToString(); 行仍应导致显示“0”,这可能意味着您缺少对 HighScoreText 的引用。您可以尝试在 Start() 方法的末尾添加一个 Debug.Log(HighScore) 并查看它正在加载什么(可能使用默认值 -1 以便您知道它是否找不到它)。
    • 我添加了 Debug.Log,它显示为 0。我的意思是文本元素 Highscore.text 显示的是当前分数,而不是 HighScore。我也收到此错误: NullReferenceException: Object reference not set to an instance of an object Score.Update () (at Assets/Scripts/Score.cs:29)... HighscoreText.text = HighScore.ToString();
    • 首先,我搞砸了,忘记更新 HighScore playerpref 保存以使用 SetInt() 而不是 SetString(),所以我的答案中已经更新了。其次,如果您获得该空引用,则意味着您的 HighScoreText 字段没有对文本元素的引用。您确定在检查器中正确分配了它吗?因为您在保存到播放器首选项之前遇到了该错误,所以它将无法完成该方法并完成保存,这可能是您没有看到保存的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多