在我的一个项目中,我最初开始使用浮点数,但稍后我意识到它的精确度并不是我想要的。我有自动系统,每秒增加X币的价值,并且假设浮动数量很大(超过200万),它就不会再添加这么小的价值了。
所以我的下一个电话是使用double而不是float。在将所有内容从float更改为double后,我意识到我将值存储在PlayerPrefs中,我想我无法存储双打?所以现在我有点困惑。
如何从PlayerPrefs中提取现有浮动信息并将该浮点值放在double中,然后将该double值保存在PlayerPrefs中?对我来说有点困惑,所以我寻求帮助。
这是我的代码的一部分:
// old
// public float totalP;
// new
public double totalP;
void OnEnable()
{
if (!PlayerPrefs.HasKey ("game_totalP"))
{
PlayerPrefs.SetFloat ("game_totalP", totalP);
}
else
{
totalP = PlayerPrefs.GetFloat ("game_totalP");
}
}
任何帮助将不胜感激!
答案 0 :(得分:3)
您可以将int
编码为两个var storeBytes = BitConverter.GetBytes(totalP);
var storeIntLow = BitConverter.ToInt32(storeBytes, 0);
var storeIntHigh = BitConverter.ToInt32(storeBytes, 4);
PlayerPrefs.SetInt("game_totalP_low", storeIntLow);
PlayerPrefs.SetInt("game_totalP_high", storeIntHigh);
并存储和检索这些内容。
存储:
var retrieveBytes = new byte[8];
Array.Copy(BitConverter.GetBytes(storeIntLow), retrieveBytes, 4);
Array.Copy(BitConverter.GetBytes(storeIntHigh), 0, retrieveBytes, 4, 4);
totalP = BitConverter.ToDouble(retrieveBytes, 0);
要检索:
{{1}}
答案 1 :(得分:1)
您可以使用PlayerPrefs
保存双倍。相应的PlayerPrefs
函数为PlayerPrefs.SetString
而非PlayerPrefs.GetFloat
。
保存的双倍:
public double totalP;
保存强>:
将其转换为字符串
string totalPStr = totalP.ToString();
另存为字符串
PlayerPrefs.SetString("game_totalP", totalPStr)
<强>加载强>:
以字符串形式加载
string tempPStr = PlayerPrefs.GetString("game_totalP");
将字符串转换为double
totalP = double.Parse(tempPStr, System.Globalization.CultureInfo.InvariantCulture);
如果您遇到totalP.ToString()
的科学记数问题,请将其更改为totalP.ToString("F6")
。最后,我认为您应该放弃PlayerPrefs
并使用序列化来保存数据。有关详细信息,请参阅this帖子。
答案 2 :(得分:1)
我不仅可以添加评论,还可以重写为其中的PlayerPrefsX扩展创建的jdphenix。大多数使用playerprefs的人只会使用它,所以在这里:
public static double GetDouble(string key)
{
var retrieveBytes = new byte[8];
Array.Copy(BitConverter.GetBytes(PlayerPrefs.GetInt(key+"_doubleLowBits")), retrieveBytes, 4);
Array.Copy(BitConverter.GetBytes(PlayerPrefs.GetInt(key+"_doubleHighBits")), 0, retrieveBytes, 4, 4);
return BitConverter.ToDouble(retrieveBytes, 0);
}
public static void SetDouble(string key, double defaultValue)
{
var storeBytes = BitConverter.GetBytes(defaultValue);
var storeIntLow = BitConverter.ToInt32(storeBytes, 0);
var storeIntHigh = BitConverter.ToInt32(storeBytes, 4);
PlayerPrefs.SetInt(key+"_doubleLowBits", storeIntLow);
PlayerPrefs.SetInt(key+"_doubleHighBits", storeIntHigh);
}
这是给其他任何从Google到这里寻求答案的人...