PlayerPrefs 无法在 Android 上运行

Posted

技术标签:

【中文标题】PlayerPrefs 无法在 Android 上运行【英文标题】:PlayerPrefs not working on 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();
     
 

【问题讨论】:

【参考方案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 字段没有对文本元素的引用。您确定在检查器中正确分配了它吗?因为您在保存到播放器首选项之前遇到了该错误,所以它将无法完成该方法并完成保存,这可能是您没有看到保存的原因。

以上是关于PlayerPrefs 无法在 Android 上运行的主要内容,如果未能解决你的问题,请参考以下文章

PlayerPrefs.SetInt 和 .GetInt 具有不良影响

Unity PlayerPrefs 的存档,到底在哪

Unity 数据持久化之PlayerPrefs 存储位置

Unity 数据持久化之PlayerPrefs 存储位置

Unity的PlayerPrefs存储路径

[Unity计时器倒计时,当应用杀死Android时不起作用