unity利用PlayerPrefs存储读取多条数据或数组
最近在学unity想对游戏得分记录进行存取操作,下面是我的思路分享给大家
PlayerPrefs只能存储int、float、string
我们想存储多条数据的话,要把其转换为string然后用一个符号连接两条数据再存入
读取时可以把这整条string用Split(char)分割再还原就行了。
比如:
public Text scoreText;
public string allScore;
public string[] scores = new string[3];
public void inScore()
{
string str=scores[0]+"&"+socres[1]+"&"+socres[2];
PlayerPrefs.SetString("ALLSCORE", str);
//ALLSCORE是key自己设置
}
public void outScore()
{
allScore = PlayerPrefs.GetString("ALLSCORE", null);
//null是默认值自己设置,可有可无
}
public void showScore()
{
string[] temp = allScore.Split('&');
for(int i=0,i<temp.lenth,i++)
scoreText.text=scoreText.text+temp[i]+"\n";
}
//这样写完后再对应的地方(比如按钮)调用就行了
下面是我的代码,我也只是刚入门,命名还没有规范,有点乱比较难懂哈,其他哪些地方写的不好还请见谅
我写了三个方法分别用来存储、读取和显示
还写了一个历史最高分,单独判断了,大家嫌代码乱的话可以忽略。
//这个是写在start()里面的
if (PlayerPrefs.HasKey("ALLDATETIMEANDSCORE"))//读取不到这个,也读取不到BESTSORRE
{
Debug.Log("ALLDATETIMEANDSCORE存在");
outScore();//读取所有历史得分数据
showScore();//显示到Text
}
else
{
allDTandScoreText.text = "还没有游戏记录";
bestScoreText.text = "历史最高分:" + "\n" + "还没有游戏记录"+ "\n" + "——————————————————————";
bestScore = 0;
//第一次游戏,历史最高分无数据
Debug.Log("ALLDATETIMEANDSCORE不存在");
Debug.Log("BESTSCORE不存在");
}
public void inScore()
{
DateTime dt = DateTime.Now;
string dT = dt.ToString();
if (playerScore > 0)//得分大于零
{
for (int i = dtAndS.Length - 1; i > 0; i--)//有l数据就后移到下标为1,dtAndS[0]空出来
dtAndS[i] = dtAndS[i - 1];
Debug.Log("dtAndS[" + 0 + "]" + "存入了一条数据");
dtAndS[0] = "得分:" + playerScore.ToString() + "日期:" + dT + "&"; //给dtAndS[0]赋值
}
for (int i = 0; i < dtAndS.Length; i++)//存入历史得分
{
if (dtAndS[i] != null && dtAndS[i] != "")
allDatetimeAndScore = allDatetimeAndScore + dtAndS[i] + "&";
}
if (dtAndS[0] != null && dtAndS[0] != "")
PlayerPrefs.SetString("ALLDATETIMEANDSCORE", allDatetimeAndScore);
//如果刚开始没有得分 就点击了相应按钮调用inscore(),此时判断dtAndS[0]是否为空,是的话说明所有下标都没数据,此时不做存储操作
if (playerScore > 0 && playerScore > bestScore)//存入历史最高分
{
string bestScore = playerScore.ToString() + "&" + "日期:" + dT;
PlayerPrefs.SetString("BESTSCORE", bestScore);
}
PlayerPrefs.Save();
}
public void outScore()
{
allDatetimeAndScore = PlayerPrefs.GetString("ALLDATETIMEANDSCORE", null);
bestScoreStr = PlayerPrefs.GetString("BESTSCORE", null);
}
public void showScore() //输出到Text
{
allDTandScoreText.text = null;
string[] temp = allDatetimeAndScore.Split('&');//临时存储所有数据
allDatetimeAndScore = null;//清空等会重新赋值,否则会数据重复
for (int i = 0, j = 0; j < dtAndS.Length; i++, j++)
{
try //对temp异常处理
{
if ((temp[i] != null && temp[i] != ""))
{
dtAndS[j] = temp[i];
allDTandScoreText.text = allDTandScoreText.text + dtAndS[j] + "\n";
Debug.Log("历史得分显示:第" + i + "条数据");
}
else if (j > 0)//保持dtAndS[]按下标顺序输出
j--;
}
catch
{
Debug.Log("仅有" + j + "条数据");
break;
}
}
try
{
temp = bestScoreStr.Split("&");
bestScore = int.Parse(temp[0]);
if (temp[0] != null && temp[0] != "")
{
bestScoreText.text = "历史最高分:" + "\n" + "得分:" + temp[0] + temp[1] + "\n" + "——————————————————————";
Debug.Log("显示历史最高分:" + "temp[0]:" + temp[0]);
}
}
catch
{
bestScore = 0;
}
}
运行结果:
这里其实可以把日期再单独放一个text,好对齐分数看起来更美观