我有2D游戏,其中我使用大约200个不同的PlayerPref来将所有类型的数据存储为字符串和整数。我一直来回调用PlayerPrefs来设置或获取数据。我想知道它有多好?或者我应该切换到SQLite或归档?我们的目标设备最大1GB内存。 数据示例:Player1Name,Player1Score,Player1Enery,Player1Lives,Player1Hp,Player1Level1TimeTaken,Player1Level1Challenge1TimeTaken。我们是否为数十名玩家和其他几个偏好做过。 TIA
答案 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数量,但我不担心。您现在所经历的被称为过早优化。只需以这种方式对其进行编码,看看它是否会导致问题然后再进行优化。