关于PlayerPrefs的使用与说明请参照这篇文章:
[Unity3D的]手机3D游戏开发:场景切换与数据存储(PlayerPrefs类的介绍与使用)
为了进一步完善上次做的演示,首先制作一个首页用来跳转到目标页。
在首页的GameStateObj中添加SetPlayerPrefs脚本:
- 功能 更新(){
- }
- 功能 开始(){
- PlayerPrefs.SetString( “ 全名” , “鲍勃” ); / /存入字符串
- }
- 变种 levelToLoad:字符串;
- 变种 图形= TextureGUI(); / /(28,23);
- 无功 起始点位置=();
- 变种 GUIColor:颜色= Color.white的;
- 变种 noGuiStyle:GUIStyle;
- 功能 开始(){
- graphic.setAnchor();
- }
- 功能 更新(){
- 如果 (graphic.texture){
- startPoint.updateLocation();
- }
- }
- 功能 OnGUI(){
- GUI.color = GUIColor;
- 如果 (GUI.Button(矩形(graphic.offset.x + startPoint.offset.x,graphic.offset.y + startPoint.offset.y,
- graphic.texture.width,graphic.texture.height),graphic.texture,noGuiStyle)){
- PlayerPrefs.Save();
- Application.LoadLevel(levelToLoad);
- }
- }
运行效果如下:
在上次的HighScoreDisplay脚本中作如下修改即可(启动方法中读取数据):
- 变种 boxStartLocation:Vector2; / /主界面元素的偏移
- 变种 中心=位置(); / /方便类计算屏幕的中心
- 功能 开始(){
- DEBUG.LOG(PlayerPrefs.GetString( “ 全名” ));
- }
- 功能 更新(){
- center.updateLocation(); / /每帧,检查屏幕已更改,重新计算屏幕的中心值。
- }
- / /绘制一个文本字符串到屏幕
- 变种 textGUIStyle:GUIStyle; / /来控制文字的显示
- 变种 roundsGUIStyle:GUIStyle; / /控制文本击杀显示器
- 变种 得分= 新的 排行榜[10]; / /名称数组的高分
- 。比分[0]名称= “www.DigitalTutors.com” ; / /排行榜#1
- 比分[1]名称=。 “ 爸爸” ;
- 比分[2]名=。 “ 凯尔” ;
- 比分[3]名称=。 “ 芳姐” ;
- 比分[4]名称=。 “ 德拉诺” ;
- 比分[5]名称=。 “ 贾斯汀” ;
- 比分[6]名称=。 “ 埃迪” ;
- 比分[7]名称=。 “ 乔希” ;
- 比分[8]名称=。 “ 克里斯” ;
- 比分[9]名称=。 “ 史蒂夫” ;
- 比分[0]轮= 999;
- 。比分[0]杀死= 999;
- 变种 heightOffset: 浮 = 10; / /多少空间给每个高分水平之间放置
- 变种 roundsOffset:浮动; / /水平偏移柱轮
- 变种 killsOffset:浮动; / /水平偏移击杀列
- 变种 numberHighscores:整型 = 8; / /控制多少循环运行,以显示
- 功能 OnGUI(){
- 为( 变种 I:整型 = 0我“numberHighscores,我+ +){ / /对于高分的数量来显示
- GUI.Box(矩形(center.offset.x + boxStartLocation.x, / /绘制一个框的名称
- center.offset.y + boxStartLocation.y + I * heightOffset,
- 222,34),总分由[i]的名字,textGUIStyle); / /使用textGUIStyle
- GUI.Box(矩形(center.offset.x + boxStartLocation.x + roundsOffset, / /绘制一个与轮框
- center.offset.y + boxStartLocation.y + I * heightOffset,
- 222,34),总分由[i] rounds.ToString(),roundsGUIStyle); / /使用roundsGUIStyle
- GUI.Box(矩形(center.offset.x + boxStartLocation.x + killsOffset, / /绘制一个框与杀害
- center.offset.y + boxStartLocation.y + I * heightOffset,
- 222,34),总分由[i] kills.ToString(),roundsGUIStyle); / /使用roundsGUIStyle
- }
- }
在主页的场景创建一个脚本GameState_simple.js来处理相关数据:
- 进口 PreviewLabs.PlayerPrefs;
- 变种 定时器:浮 = 10;
- 私人 变种 origTimer:浮动;
- 变种 maxTimer:浮动;
- 变种 roundsWon:整型 = 1;
- 变种 enemyKills:整型 = 0;
- 变种 totalEnemyKills:整型 = 0;
- 变种 transitionDelay:浮 = 0;
- 功能 OnGUI(){
- 如果 (GUI.Button(矩形(10,70,50,30), “ 点击” )){
- / /排行榜命名方案
- / /开始键:“高分”
- / /过去认为,无论设置需要
- PreviewLabs.PlayerPrefs.SetInt(“highscoreCurrentRounds” ,roundsWon);
- PreviewLabs.PlayerPrefs.SetInt(“highscoreCurrentKills” ,totalEnemyKills);
- PreviewLabs.PlayerPrefs.Flush();
- }
- }
- 功能 清醒(){
- origTimer =定时器;
- }
- 功能 开始(){
- maxTimer =定时器;
- / /如果有一个GameID,我们想要得到它,并添加一个
- 变种 gameID:整数;
- 如果 (PreviewLabs.PlayerPrefs.HasKey(“highscoreCurrentGameID” )){
- gameID = PreviewLabs.PlayerPrefs.GetInt(“highscoreCurrentGameID” );
- PreviewLabs.PlayerPrefs.SetInt(“highscoreCurrentGameID” ,+ + gameID);
- } 否则 {
- PreviewLabs.PlayerPrefs.SetInt(“highscoreCurrentGameID” ,1);
- }
- }
- 功能 EnemyKilled(){
- enemyKills + = 1;
- enemyKills = Mathf.Clamp(enemyKills,0,999999);
- totalEnemyKills + = 1;
- totalEnemyKills = Mathf.Clamp(totalEnemyKills,0,999999);
- }
- 功能 WonRound(){
- roundsWon + +;
- }
- 变种 isGameOver:布尔 = 假;
- 功能 就GameOver(){
- 如果 (!isGameOver){
- NotificationCenter.DefaultCenter()PostNotification(这个, “就GameOver” );
- isGameOver = 真;
- }
- / /等死打,别的东西吗?
- Application.LoadLevel( “ 高分” );
- }
这样在初始化的时候点击按钮便会将数据写入本地。
再在后面的脚本中将原脚本的启动方法:
- 功能 开始(){
- DEBUG.LOG(PlayerPrefs.GetString( “ 全名” ));
- }
- 功能 开始(){
- DEBUG.LOG( “ 键”highscoreCurrentRounds'的值是:“ + PlayerPrefs.GetInt(“highscoreCurrentRounds” ));
- DEBUG.LOG( “ 键”highscoreCurrentKills'的值是:“ + PlayerPrefs.GetInt(“highscoreCurrentKills” ));
- }
此时再运行项目就会发现,欢迎界面对数据进行修改后点击按钮即可存之本地,并且再次运行依旧有效:
接下来就是实现PlayerPrefs和本地数据的同步。
我们添加一个SyncPlayerPrefs函数用来实现同步数据:
- 功能 SyncPlayerPrefs(){
- / /我们的假设是,在播放器首选项中的数据应该凌驾本地数据
- / /需要这个,看看我们是否有球员首选项键,如果我们这样做,复制到本地
- / /如果该键不存在,我们需要与当地的数据填充它
- 为( 变种 I:整型 = 0我“numberHighscores,我+ +){ / /为高分人数
- 如果 (PlayerPrefs.HasKey( “ 高分” + I + “姓名” )){
- / /复制玩家的偏好值本地高分数组类
- 分数由[i]名称= PlayerPrefs.GetString( “ 高分” + I + “姓名” );
- } 否则 {
- / /设置播放器首选项以本地数据
- PlayerPrefs.SetString( “ 高分” + I + “姓名” ,分数由[i]名);
- }
- }
- }
然后再在更新方法中刷新数据并调用启动函数来打印数据:
- 功能 开始(){
- DEBUG.LOG( “ 关键”highscore4name'的值是:“ + PlayerPrefs.GetString(“highscore4name” ));
- DEBUG.LOG( “ 关键”highscore8name'的值是:“ + PlayerPrefs.GetString(“highscore8name” ));
- }
- 功能 更新(){
- center.updateLocation(); / /每帧,检查屏幕已更改,重新计算屏幕的中心值。
- SyncPlayerPrefs();
- 开始();
- }
此时运行项目便会发现本来是脚本中的数据已经可以写入到本地了:
可以使用相同的方法写入大红大紫好杀敌等数据:
- 功能 SyncPlayerPrefs(){
- / /我们的假设是,在播放器首选项中的数据应该凌驾本地数据
- / /需要这个,看看我们是否有球员首选项键,如果我们这样做,复制到本地
- / /如果该键不存在,我们需要与当地的数据填充它
- 为( 变种 I:整型 = 0我“numberHighscores,我+ +){ / /为高分人数
- 如果 (PlayerPrefs.HasKey( “ 高分” + I + “姓名” )){
- / /复制玩家的偏好值本地高分数组类
- 分数由[i]名称= PlayerPrefs.GetString( “ 高分” + I + “姓名” );
- } 否则 {
- / /设置播放器首选项以本地数据
- PlayerPrefs.SetString( “ 高分” + I + “姓名” ,分数由[i]名);
- }
- 如果 (PlayerPrefs.HasKey( “ 高分” + I + “轮” )){
- / /复制玩家的偏好值本地高分数组类
- 。得分由[i] =轮PlayerPrefs.GetInt( “ 高分” + I + “轮” );
- } 否则 {
- / /设置播放器首选项以本地数据
- PlayerPrefs.SetInt( “ 高分” + I + “回合” ,得分由[i]四舍五入);
- }
- 如果 (PlayerPrefs.HasKey( “ 高分” + I + “杀死” )){
- / /复制玩家的偏好值本地高分数组类
- 。得分由[i]杀死= PlayerPrefs.GetInt( “ 高分” + i + “杀死” );
- } 否则 {
- / /设置播放器首选项以本地数据
- PlayerPrefs.SetInt( “ 高分” + I + “杀死” ,得分由[i]杀死。);
- }
- }
- }
但是这样的简单存储一般来说是难以满足需要的。所以我们需要添加一个函数AddNewHighScore:
- 功能 AddNewHighscore(){
- 无功 curRounds = PlayerPrefs.GetInt(“highscoreCurrentRounds” );
- 无功 curKills = PlayerPrefs.GetInt(“highscoreCurrentKills” );
- 变种 newHighscorePosition: 整数;
- / /检查当前的得分都不错/以上的playersPrefs高分
- / /我们要假设本地和playerprefs数据是一样的吗? - 是的
- 为( 变种 I:整型 = 0我“numberHighscores,我+ +){ / /为高分人数
- 如果 (curRounds>得分由[i]。四舍五入){
- / /新的得分越高!
- newHighscorePosition = I;
- 打破;
- } 否则 ,如果 (curRounds ==得分由[i]。回合&& curKills>得分由[i]。杀死){
- / /新的分数等于在两轮和杀死更大
- newHighscorePosition = I;
- 打破;
- } / /如果两轮都是平等的,杀死少
- } / /如果回合少
- DEBUG.LOG(newHighscorePosition);
- / /如果是计算什么新houigschore的#会
- / /将其添加到我们的数据并保存。
- }
,当然现在还只能在控制台输出数据比如原始数据是1,12:
跳转到前端后修改数值:
在跳转回排行榜就会发现数据发生了改变:
完整的脚本HighScoreDisplay.js代码如下:
- / /这就是所谓的后一个玩家死亡或者从主菜单
- / /显示高分
- / /跟踪如下:玩家姓名,查房的高分人数存活并杀死
- / /在进入高分菜单,测试,如果我们有一个高的分数,如果我们这样做,请问
- / /播放器输入名称,并把它添加到高分保存数据。
- 变种 boxStartLocation:Vector2; / /主界面元素的偏移
- 变种 中心=位置(); / /方便类计算屏幕的中心
- 功能 开始(){
- DEBUG.LOG( “ 键”highscoreCurrentRounds'的值是:“ + PlayerPrefs.GetInt(“highscoreCurrentRounds” ));
- DEBUG.LOG( “ 键”highscoreCurrentKills'的值是:“ + PlayerPrefs.GetInt(“highscoreCurrentKills” ));
- AddNewHighscore();
- }
- 功能 更新(){
- center.updateLocation(); / /每帧,检查屏幕已更改,重新计算屏幕的中心值。
- / / SyncPlayerPrefs();
- / /启动();
- }
- / /绘制一个文本字符串到屏幕
- 变种 textGUIStyle:GUIStyle; / /来控制文字的显示
- 变种 roundsGUIStyle:GUIStyle; / /控制文本击杀显示器
- 变种 得分= 新的 排行榜[10]; / /名称数组的高分
- 。比分[0]名称= “www.DigitalTutors.com” ; / /排行榜#1
- 比分[1]名称=。 “ 爸爸” ;
- 比分[2]名=。 “ 凯尔” ;
- 比分[3]名称=。 “ 芳姐” ;
- 比分[4]名称=。 “ 德拉诺” ;
- 比分[5]名称=。 “ 贾斯汀” ;
- 比分[6]名称=。 “ 埃迪” ;
- 比分[7]名称=。 “ 乔希” ;
- 比分[8]名称=。 “ 克里斯” ;
- 比分[9]名称=。 “ 史蒂夫” ;
- 。比分[0]回合= 99;
- 。比分[0]杀死= 999;
- 。比分[1]两轮= 1;
- 。比分[1]杀死= 9;
- 变种 heightOffset: 浮 = 10; / /多少空间给每个高分水平之间放置
- 变种 roundsOffset:浮动; / /水平偏移柱轮
- 变种 killsOffset:浮动; / /水平偏移击杀列
- 变种 numberHighscores:整型 = 8; / /控制多少循环运行,以显示
- 功能 OnGUI(){
- 为( 变种 I:整型 = 0我“numberHighscores,我+ +){ / /对于高分的数量来显示
- GUI.Box(矩形(center.offset.x + boxStartLocation.x, / /绘制一个框的名称
- center.offset.y + boxStartLocation.y + I * heightOffset,
- 222,34),总分由[i]的名字,textGUIStyle); / /使用textGUIStyle
- GUI.Box(矩形(center.offset.x + boxStartLocation.x + roundsOffset, / /绘制一个与轮框
- center.offset.y + boxStartLocation.y + I * heightOffset,
- 222,34),总分由[i] rounds.ToString(),roundsGUIStyle); / /使用roundsGUIStyle
- GUI.Box(矩形(center.offset.x + boxStartLocation.x + killsOffset, / /绘制一个框与杀害
- center.offset.y + boxStartLocation.y + I * heightOffset,
- 222,34),总分由[i] kills.ToString(),roundsGUIStyle); / /使用roundsGUIStyle
- }
- }
- / /排行榜命名方案
- / /开始键:“高分”
- / /过去认为,无论设置需要
- / /一个特定的高分是这样的:
- / / highscore4name
- 功能 AddNewHighscore(){
- 无功 curRounds = PlayerPrefs.GetInt(“highscoreCurrentRounds” );
- 无功 curKills = PlayerPrefs.GetInt(“highscoreCurrentKills” );
- 变种 newHighscorePosition: 整数;
- / /检查当前的得分都不错/以上的playersPrefs高分
- / /我们要假设本地和playerprefs数据是一样的吗? - 是的
- 为( 变种 I:整型 = 0我“numberHighscores,我+ +){ / /为高分人数
- 如果 (curRounds>得分由[i]。四舍五入){
- / /新的得分越高!
- newHighscorePosition = I;
- 打破;
- } 否则 ,如果 (curRounds ==得分由[i]。回合&& curKills>得分由[i]。杀死){
- / /新的分数等于在两轮和杀死更大
- newHighscorePosition = I;
- 打破;
- } / /如果两轮都是平等的,杀死少
- } / /如果回合少
- DEBUG.LOG(newHighscorePosition);
- / /如果是计算什么新houigschore的#会
- / /将其添加到我们的数据并保存。
- }
- 功能 SyncPlayerPrefs(){
- / /我们的假设是,在播放器首选项中的数据应该凌驾本地数据
- / /需要这个,看看我们是否有球员首选项键,如果我们这样做,复制到本地
- / /如果该键不存在,我们需要与当地的数据填充它
- 为( 变种 I:整型 = 0我“numberHighscores,我+ +){ / /为高分人数
- 如果 (PlayerPrefs.HasKey( “ 高分” + I + “姓名” )){
- / /复制玩家的偏好值本地高分数组类
- 分数由[i]名称= PlayerPrefs.GetString( “ 高分” + I + “姓名” );
- } 否则 {
- / /设置播放器首选项以本地数据
- PlayerPrefs.SetString( “ 高分” + I + “姓名” ,分数由[i]名);
- }
- 如果 (PlayerPrefs.HasKey( “ 高分” + I + “轮” )){
- / /复制玩家的偏好值本地高分数组类
- 。得分由[i] =轮PlayerPrefs.GetInt( “ 高分” + I + “轮” );
- } 否则 {
- / /设置播放器首选项以本地数据
- PlayerPrefs.SetInt( “ 高分” + I + “回合” ,得分由[i]四舍五入);
- }
- 如果 (PlayerPrefs.HasKey( “ 高分” + I + “杀死” )){
- / /复制玩家的偏好值本地高分数组类
- 。得分由[i]杀死= PlayerPrefs.GetInt( “ 高分” + i + “杀死” );
- } 否则 {
- / /设置播放器首选项以本地数据
- PlayerPrefs.SetInt( “ 高分” + I + “杀死” ,得分由[i]杀死。);
- }
- }
- }