c# - 尽管我在 android 上使用“HasKey”和 Save(),为什么 PlayerPrefs 不起作用?
问题描述
我知道其他人以前写过这个问题,但即使我使用 haskey 或保存我的 android 设备也不会保存数据。顺便说一句,它在 PC 上工作正常。
public class PlayerData : MonoBehaviour
{
public float HighScore { get; set; }
}
用于保存和加载的其他脚本
public class PlayerPersistence : MonoBehaviour
{
public static void SavePlayerHighScore(float highScore)
{
if (PlayerPrefs.HasKey("HighScore"))
{
Debug.Log("has key");
}
else
{
PlayerPrefs.SetFloat("HighScore", highScore);
PlayerPrefs.Save();
}
}
public static PlayerData LoadData()
{
float highScore = PlayerPrefs.GetFloat("HighScore", 0);
PlayerPrefs.Save();
PlayerData playerData = new PlayerData()
{
HighScore = highScore
};
return playerData;
}
}
像这样打电话
public PlayerData playerData { get; private set; }
private void Awake()
{
playerData = PlayerPersistence.LoadData();
HighScore();
t.text = playerData.HighScore.ToString();
}
编辑:计时器实际上是分数,如果小于 highScore(保存的数据)正在用旧数据更改新的,这就是我调用类的方式
public PlayerData playerData { get; private set; }
private void Awake()
{
playerData = PlayerPersistence.LoadData();
}
if(finish){
if (timer < playerData.HighScore)
{
PlayerPersistence.SavePlayerHighScore(timer); // last score;
playerData = PlayerPersistence.LoadData();
bestTime.text = "Best Time: " + playerData.HighScore.ToString();
}
else
{
bestTime.text = "Best Time: " + playerData.HighScore.ToString();
}
}
解决方案
首先:如果您对纯数据容器进行分类而不需要附加到游戏对象,那么它们不应该是MonoBehaviour
!特别是在 Unity 中禁止new
使用for MonoBehaviour
。(参见例如为什么我会收到警告:您正在尝试使用“new”关键字创建“MonoBehaviour”)
它应该是
// Use Serializable and fields instead of properties
// So you can actually see the values in the Unity inspector!
[Serializable]
public class PlayerData
{
public float HighScore;
}
和
// This class can even be static since it only contains static members
// and never needs/means to be instantiated
public static class PlayerPersistence
{
...
}
那么,如果到目前为止还没有高分,为什么你只保存一个新的高分呢?您不想检查新的高分是否更高,然后覆盖现有的高分吗?也不需要使用PlayerPrefs.Save
after GetInt
;)
public static class PlayerPersistence
{
// Optional parameter: if you don't pass it in it will always assume false by default
public static void SavePlayerHighScore(float highScore, bool forceOverwrite = false)
{
if (!forceOverwrite && PlayerPrefs.HasKey("HighScore"))
{
Debug.Log("has key -> check if higher");
var currentScore = PlayerPrefs.GetFloat("HighScore");
if(currentScore >= highScore)
{
Debug.LogWarning("Current HighScore is higher -> will not overwrite");
return;
}
}
Debug.Log("Saving new Highscore");
PlayerPrefs.SetFloat("HighScore", highScore);
PlayerPrefs.Save();
}
public static PlayerData LoadData()
{
var highScore = PlayerPrefs.GetFloat("HighScore", 0);
PlayerData playerData = new PlayerData()
{
HighScore = highScore
};
return playerData;
}
}
最后应该是
[SerializeField] private PlayerData _playerData;
public PlayerData PlayerData => _playerData;
private void Awake()
{
_playerData = PlayerPersistence.LoadData();
HighScore();
t.text = _playerData.HighScore.ToString();
}
现在它当然仍然取决于SavePlayerHighScore
您没有向我们展示的确切调用方式。
推荐阅读
- bash - 在 jenkins 配置 shell 中为双引号表达式添加了额外的单引号
- google-cloud-dataflow - 写入步骤完成后流式传输管道发布到 pubsub
- c++ - 使用虚拟变量在循环内切片 std::vector 的最佳方法
- rust - 在 Rust 中实现链表时如何复制原始指针?
- python - 如何将 askdirectory 结果保存在我可以使用 tkinter 和 OOP 使用的变量中?
- python - 如何在 Python 函数中接受无限闭包?
- c - 将一组动态可变参数传递给 C 函数
- python - 我仍然收到错误 ImportError: No module named requests 在使用 pip3 安装请求后
- php - 从 PHP 中的字符串访问“复杂”对象属性
- javascript - Javascript 输入 UTC 字符串