使用PlayerPrefs保存双倍?

时间:2018-04-01 01:44:03

标签: c# unity3d

在我的一个项目中,我最初开始使用浮点数,但稍后我意识到它的精确度并不是我想要的。我有自动系统,每秒增加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");
    }        
}

任何帮助将不胜感激!

3 个答案:

答案 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到这里寻求答案的人...