Unity:在内存和处理方面,PlayerPrefs在统一方面有多重?

时间:2016-07-13 10:05:23

标签: c# database sqlite unity3d

我有2D游戏,其中我使用大约200个不同的PlayerPref来将所有类型的数据存储为字符串和整数。我一直来回调用PlayerPrefs来设置或获取数据。我想知道它有多好?或者我应该切换到SQLite或归档?我们的目标设备最大1GB内存。 数据示例:Player1Name,Player1Score,Player1Enery,Player1Lives,Player1Hp,Player1Level1TimeTaken,Player1Level1Challenge1TimeTaken。我们是否为数十名玩家和其他几个偏好做过。 TIA

2 个答案:

答案 0 :(得分:1)

通过阅读您的评论,PlayerPrefs使用它的方式没有问题。我看到的唯一问题是你是单独保存每个玩家的数据属性。

  

数据示例:Player1Name,Player1Score,Player1Enery,Player1Lives,   Player1Hp,Player1Level1TimeTaken,Player1Level1Challenge1TimeTaken。   我们是为数十名球员和其他几位球员做过的   偏好也是如此。 TIA

如果您拥有许多用户属性,则这不是保存数据的正确方法。假设这是一个或两个变量,那么你可以,但你有超过7个变量*玩家数量(数十个)。

当你完成所有这些变量的保存时,到处都会有注册表keys。您可以在保存播放器信息后转到HKCU\Software[company name][product name] key验证这一点。

将这些玩家信息放入一个类然后将其转换为Json并将其保存为一个信息数据。

玩家资料:

[System.Serializable]
public class PlayerInfo
{
    public string playerName;
    public int playerScore;
    public int playerEnergy;
    public int playerLives;
    public int playerHP;
    public float playerLevelTimeTaken;
    public float playerLevelChallengeTimeTaken;
}

保存玩家信息

void savePlayerInfo()
{
    //Create one for player one
    PlayerInfo playerInfo1 = new PlayerInfo();
    playerInfo1.playerName = "Affan 1";

    //Create one for player two
    PlayerInfo playerInfo2 = new PlayerInfo();
    playerInfo2.playerName = "Affan 2";

    //Create one for player three
    PlayerInfo playerInfo3 = new PlayerInfo();
    playerInfo3.playerName = "Affan 3";

    //Convert each of them to Json
    string p1Json = JsonUtility.ToJson(playerInfo1);
    string p2Json = JsonUtility.ToJson(playerInfo2);
    string p3Json = JsonUtility.ToJson(playerInfo3);

    //Now Save all 3 player Info
    PlayerPrefs.SetString("p1", p1Json);
    PlayerPrefs.SetString("p2", p2Json);
    PlayerPrefs.SetString("p3", p3Json);
}

加载玩家资讯

void loadPlayerInfo()
{
    //Load all 3 player Info
    string p1Json = PlayerPrefs.GetString("p1");
    string p2Json = PlayerPrefs.GetString("p2");
    string p3Json = PlayerPrefs.GetString("p3");

    //Convert each of them back to class
    PlayerInfo playerInfo1 = JsonUtility.FromJson<PlayerInfo>(p1Json);
    PlayerInfo playerInfo2 = JsonUtility.FromJson<PlayerInfo>(p2Json);
    PlayerInfo playerInfo3 = JsonUtility.FromJson<PlayerInfo>(p3Json);

    //Use
    Debug.Log("Player 1 Name: " + playerInfo1.playerName);
    Debug.Log("Player 2 Name: " + playerInfo2.playerName);
    Debug.Log("Player 3 Name: " + playerInfo3.playerName);
}

要让它更容易迭代它们,请将其设为数组,然后使用p0作为p49作为键。这假设您需要50名玩家的玩家信息。

阅读

PlayerInfo[] players;
void loadPlayerArrayInfo()
{
    players = new PlayerInfo[50];
    for (int i = 0; i < 50; i++)
    {
        players[i] = new PlayerInfo();
        string tempPlayerKey = "p" + i;
        string playerJson = PlayerPrefs.GetString(tempPlayerKey);
        players[i] = JsonUtility.FromJson<PlayerInfo>(playerJson);
    }
}

这可以使您的注册表清洁,并使更轻松将您的播放器设置移至另一个游戏引擎,如果您要远离Unity。

答案 1 :(得分:0)

PlayerPrefs可以读取和设置3种类型的变量。 Float,int和string。 int和float都是内存长度为32个字节。字符串占用20+(n / 2)* 4个字节,其中n是字符串中的字符数。字符串大小可能会有所不同,具体取决于统一开发人员如何将c#代码编译为本机代码。正如您所看到的,即使对于只有1 gb内存的设备,尺寸也非常小。您可以使用这些指标来计算变量占用的ram数量,但我不担心。您现在所经历的被称为过早优化。只需以这种方式对其进行编码,看看它是否会导致问题然后再进行优化。