【发布时间】:2020-03-13 08:45:56
【问题描述】:
我一直在寻找信息来尝试解决我的问题,但我就是不知道是什么原因造成的。播放器首选项似乎在统一编辑器中运行良好,但是一旦我为 Android 或 PC 构建了它们,它们就全部消失了。我的项目中没有 PlayerPrefs.deleteAll 。
我有 3 个场景:菜单、游戏和 GameOver。当我启动菜单场景时,我运行附加到 MainCamera 的这个脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class prefs : MonoBehaviour
{
public static int bestRecord;
// Start is called before the first frame update
void Start()
{
bestRecord = PlayerPrefs.GetInt("K", 1);
Debug.Log(PlayerPrefs.GetInt("K").ToString());
}
}
当我进入游戏场景时,我的分数是一个 TextMeshProUGUI,它通过 InvokeRepeating 不断更新:
public TextMeshProUGUI points;
void Start()
{
stop = false;
InvokeRepeating("subirMetros", 0f, 0.01f);
}
private void subirMetros()
{
if (stop == false)
{
points.SetText(Math.Round(character.transform.position.x, 0) + "");
}
}
//GameOver is called when the player dies
public void GameOver()
{
stop = true;
CancelInvoke("subirMetros");
int finalPoints = Int32.Parse(points.text);
int recordActual = PlayerPrefs.GetInt("K");
if (recordActual < finalPoints)
{
PlayerPrefs.SetInt("K", finalPoints);
}
SceneManager.LoadScene("GameOver");
}
}
最后,当开始 GameOver 场景时,我再次获得了在我到达场景之前应该保存的 PlayerPrefs:
public TextMeshProUGUI record;
void Start()
{
record.text = PlayerPrefs.GetInt("K").ToString();
}
奇怪的是,这在统一编辑器中工作,但不是在我构建它时。如果有人可以帮助我,我将不胜感激,谢谢。
【问题讨论】:
-
出于调试目的,为了反映您的应用程序的新用户会看到什么,从编辑器运行时偶尔使用
PlayerPrefs.DeleteAll()是一种很好的做法。 (用#if UNITY_EDITOR 包裹它以增加安全性,以防您忘记取出它。)这样做后,再次在编辑器中点击播放——一切都按预期工作吗? -
你为什么不打电话给
PlayerPrefs.Save()? -
@PhilippLenssen 我不知道这个功能,我一直在测试,但在构建时我仍然得到 0 分......这没有任何意义,因为我使用 1 作为默认值。当我删除所有 Player Prefs 时,它仍然在编辑器中工作。
-
您需要按照已经建议的方式进行调试。但是,您应该使用最合适的数据类型存储数据,即
int,因此在内部使用它而不是string。string可能不是您期望的格式,因此无法转换为int。 -
@trojanfoe 就是这样!这是转换中的错误...非常感谢!