最高分存储

关于PlayerPrefs的使用与说明请参照这篇文章:

[Unity3D的]手机3D游戏开发:场景切换与数据存储(PlayerPrefs类的介绍与使用)


为了进一步完善上次做的演示,首先制作一个首页用来跳转到目标页。

在首页的GameStateObj中添加SetPlayerPrefs脚本:

[浏览器]   鉴于普通 副本
  1. 功能 更新(){  
  2. }  
  3.   
  4. 功能 开始(){  
  5.     PlayerPrefs.SetString( “ 全名” ,  “鲍勃” ); / /存入字符串  
  6. }  
再添加一个LoadLevelButton脚本创建跳转按钮和相关操作:

[浏览器]   鉴于普通 副本
  1. 变种 levelToLoad:字符串;  
  2. 变种 图形= TextureGUI();  / /(28,23);  
  3. 无功 起始点位置=();  
  4. 变种 GUIColor:颜色= Color.white的;  
  5. 变种 noGuiStyle:GUIStyle;  
  6.   
  7. 功能 开始(){  
  8.     graphic.setAnchor();  
  9. }  
  10.   
  11. 功能 更新(){  
  12.     如果 (graphic.texture){  
  13.         startPoint.updateLocation();  
  14.     }  
  15. }  
  16.   
  17. 功能 OnGUI(){  
  18.     GUI.color = GUIColor;  
  19.     如果 (GUI.Button(矩形(graphic.offset.x + startPoint.offset.x,graphic.offset.y + startPoint.offset.y,  
  20.             graphic.texture.width,graphic.texture.height),graphic.texture,noGuiStyle)){  
  21.         PlayerPrefs.Save();  
  22.         Application.LoadLevel(levelToLoad);                   
  23.     }             
  24. }  

运行效果如下:

最高分存储_第1张图片

在上次的HighScoreDisplay脚本中作如下修改即可(启动方法中读取数据):

[浏览器]   鉴于普通 副本
  1. 变种 boxStartLocation:Vector2;  / /主界面元素的偏移  
  2. 变种 中心=位置();  / /方便类计算屏幕的中心  
  3.   
  4. 功能 开始(){  
  5.     DEBUG.LOG(PlayerPrefs.GetString( “ 全名” ));  
  6. }  
  7.   
  8. 功能 更新(){  
  9.     center.updateLocation();  / /每帧,检查屏幕已更改,重新计算屏幕的中心值。  
  10. }  
  11.   
  12. / /绘制一个文本字符串到屏幕  
  13.   
  14. 变种 textGUIStyle:GUIStyle;  / /来控制文字的显示  
  15. 变种 roundsGUIStyle:GUIStyle;  / /控制文本击杀显示器  
  16. 变种 得分=  新的 排行榜[10];  / /名称数组的高分  
  17.   
  18. 。比分[0]名称=  “www.DigitalTutors.com” / /排行榜#1  
  19. 比分[1]名称=。 “ 爸爸” ;  
  20. 比分[2]名=。 “ 凯尔” ;  
  21. 比分[3]名称=。 “ 芳姐” ;  
  22. 比分[4]名称=。 “ 德拉诺” ;  
  23. 比分[5]名称=。 “ 贾斯汀” ;  
  24. 比分[6]名称=。 “ 埃迪” ;  
  25. 比分[7]名称=。 “ 乔希” ;  
  26. 比分[8]名称=。 “ 克里斯” ;  
  27. 比分[9]名称=。 “ 史蒂夫” ;  
  28. 比分[0]轮= 999;  
  29. 。比分[0]杀死= 999;  
  30.   
  31. 变种 heightOffset:   = 10;  / /多少空间给每个高分水平之间放置  
  32. 变种 roundsOffset:浮动/ /水平偏移柱轮  
  33. 变种 killsOffset:浮动/ /水平偏移击杀列  
  34.   
  35. 变种 numberHighscores:整型 = 8;  / /控制多少循环运行,以显示  
  36.   
  37. 功能 OnGUI(){  
  38.   
  39.     (  变种 I:整型 = 0我“numberHighscores,我+ +){  / /对于高分的数量来显示  
  40.         GUI.Box(矩形(center.offset.x + boxStartLocation.x,  / /绘制一个框的名称  
  41.         center.offset.y + boxStartLocation.y + I * heightOffset,  
  42.         222,34),总分由[i]的名字,textGUIStyle);  / /使用textGUIStyle  
  43.           
  44.         GUI.Box(矩形(center.offset.x + boxStartLocation.x + roundsOffset,  / /绘制一个与轮框  
  45.         center.offset.y + boxStartLocation.y + I * heightOffset,  
  46.         222,34),总分由[i] rounds.ToString(),roundsGUIStyle);  / /使用roundsGUIStyle  
  47.           
  48.         GUI.Box(矩形(center.offset.x + boxStartLocation.x + killsOffset,  / /绘制一个框与杀害  
  49.         center.offset.y + boxStartLocation.y + I * heightOffset,  
  50.         222,34),总分由[i] kills.ToString(),roundsGUIStyle);  / /使用roundsGUIStyle  
  51.     }  
  52. }  
当然这样只能将数据读取并显示在控制台面板上:

最高分存储_第2张图片

在主页的场景创建一个脚本GameState_simple.js来处理相关数据:

[浏览器]   鉴于普通 副本
  1. 进口 PreviewLabs.PlayerPrefs;  
  2.   
  3. 变种 定时器: = 10;  
  4. 私人 变种 origTimer:浮动;  
  5. 变种 maxTimer:浮动;  
  6.   
  7. 变种 roundsWon:整型 = 1;  
  8. 变种 enemyKills:整型 = 0;  
  9. 变种 totalEnemyKills:整型 = 0;  
  10. 变种 transitionDelay: = 0;  
  11.   
  12. 功能 OnGUI(){  
  13.     如果 (GUI.Button(矩形(10,70,50,30), “ 点击” )){  
  14.     / /排行榜命名方案  
  15.     / /开始键:“高分”  
  16.     / /过去认为,无论设置需要  
  17.         PreviewLabs.PlayerPrefs.SetInt(“highscoreCurrentRounds” ,roundsWon);  
  18.         PreviewLabs.PlayerPrefs.SetInt(“highscoreCurrentKills” ,totalEnemyKills);  
  19.         PreviewLabs.PlayerPrefs.Flush();  
  20.     }  
  21. }  
  22.   
  23. 功能 清醒(){  
  24.     origTimer =定时器;  
  25. }  
  26.   
  27.   
  28.   
  29. 功能 开始(){  
  30.     maxTimer =定时器;  
  31.     / /如果有一个GameID,我们想要得到它,并添加一个  
  32.     变种 gameID:整数;  
  33.     如果 (PreviewLabs.PlayerPrefs.HasKey(“highscoreCurrentGameID” )){  
  34.         gameID = PreviewLabs.PlayerPrefs.GetInt(“highscoreCurrentGameID” );  
  35.         PreviewLabs.PlayerPrefs.SetInt(“highscoreCurrentGameID” ,+ + gameID);  
  36.     }  否则 {  
  37.          PreviewLabs.PlayerPrefs.SetInt(“highscoreCurrentGameID” ,1);  
  38.     }  
  39. }  
  40.   
  41.   
  42. 功能 EnemyKilled(){  
  43.     enemyKills + = 1;  
  44.     enemyKills = Mathf.Clamp(enemyKills,0,999999);  
  45.     totalEnemyKills + = 1;  
  46.     totalEnemyKills = Mathf.Clamp(totalEnemyKills,0,999999);          
  47. }  
  48.   
  49.   
  50. 功能 WonRound(){  
  51.     roundsWon + +;  
  52. }  
  53.   
  54. 变种 isGameOver:布尔 =  ;  
  55.   
  56. 功能 就GameOver(){  
  57.     如果 (!isGameOver){  
  58.         NotificationCenter.DefaultCenter()PostNotification(这个,  “就GameOver” );  
  59.         isGameOver =  ;  
  60.     }  
  61.     / /等死打,别的东西吗?  
  62.       
  63.     Application.LoadLevel( “ 高分” );  
  64. }  

这样在初始化的时候点击按钮便会将数据写入本地。

再在后面的脚本中将原脚本的启动方法:

[浏览器]   鉴于普通 副本
  1. 功能 开始(){  
  2.     DEBUG.LOG(PlayerPrefs.GetString( “ 全名” ));  
  3. }  
做如下修改即可:

[浏览器]   鉴于普通 副本
  1. 功能 开始(){  
  2.     DEBUG.LOG( “ 键”highscoreCurrentRounds'的值是:“  + PlayerPrefs.GetInt(“highscoreCurrentRounds” ));  
  3.     DEBUG.LOG( “ 键”highscoreCurrentKills'的值是:“  + PlayerPrefs.GetInt(“highscoreCurrentKills” ));  
  4. }  

此时再运行项目就会发现,欢迎界面对数据进行修改后点击按钮即可存之本地,并且再次运行依旧有效:

最高分存储_第3张图片

接下来就是实现PlayerPrefs和本地数据的同步。

我们添加一个SyncPlayerPrefs函数用来实现同步数据:

[浏览器]   鉴于普通 副本
  1. 功能 SyncPlayerPrefs(){  
  2.     / /我们的假设是,在播放器首选项中的数据应该凌驾本地数据  
  3.     / /需要这个,看看我们是否有球员首选项键,如果我们这样做,复制到本地  
  4.     / /如果该键不存在,我们需要与当地的数据填充它  
  5.       
  6.     (  变种 I:整型 = 0我“numberHighscores,我+ +){  / /为高分人数  
  7.       
  8.         如果 (PlayerPrefs.HasKey( “ 高分”  + I +  “姓名”  )){  
  9.             / /复制玩家的偏好值本地高分数组类  
  10.             分数由[i]名称= PlayerPrefs.GetString( “ 高分”  + I +  “姓名” );  
  11.         }  否则 {  
  12.             / /设置播放器首选项以本地数据  
  13.             PlayerPrefs.SetString( “ 高分”  + I +  “姓名”  ,分数由[i]名);  
  14.         }  
  15.     }     
  16. }  

然后再在更新方法中刷新数据并调用启动函数来打印数据:

[浏览器]   鉴于普通 副本
  1. 功能 开始(){  
  2.     DEBUG.LOG( “ 关键”highscore4name'的值是:“  + PlayerPrefs.GetString(“highscore4name” ));  
  3.     DEBUG.LOG( “ 关键”highscore8name'的值是:“  + PlayerPrefs.GetString(“highscore8name” ));  
  4. }  
  5. 功能 更新(){  
  6.     center.updateLocation();  / /每帧,检查屏幕已更改,重新计算屏幕的中心值。  
  7.     SyncPlayerPrefs();  
  8.     开始();  
  9. }  

此时运行项目便会发现本来是脚本中的数据已经可以写入到本地了:

最高分存储_第4张图片

可以使用相同的方法写入大红大紫好杀敌等数据:

[浏览器]   鉴于普通 副本
  1. 功能 SyncPlayerPrefs(){  
  2.     / /我们的假设是,在播放器首选项中的数据应该凌驾本地数据  
  3.     / /需要这个,看看我们是否有球员首选项键,如果我们这样做,复制到本地  
  4.     / /如果该键不存在,我们需要与当地的数据填充它  
  5.       
  6.     (  变种 I:整型 = 0我“numberHighscores,我+ +){  / /为高分人数  
  7.       
  8.         如果 (PlayerPrefs.HasKey( “ 高分”  + I +  “姓名”  )){  
  9.             / /复制玩家的偏好值本地高分数组类  
  10.             分数由[i]名称= PlayerPrefs.GetString( “ 高分”  + I +  “姓名” );  
  11.         }  否则 {  
  12.             / /设置播放器首选项以本地数据  
  13.             PlayerPrefs.SetString( “ 高分”  + I +  “姓名”  ,分数由[i]名);  
  14.         }  
  15.           
  16.         如果 (PlayerPrefs.HasKey( “ 高分”  + I +  “轮”  )){  
  17.             / /复制玩家的偏好值本地高分数组类  
  18.             。得分由[i] =轮PlayerPrefs.GetInt( “ 高分”  + I +  “轮” );  
  19.         }  否则 {  
  20.             / /设置播放器首选项以本地数据  
  21.             PlayerPrefs.SetInt( “ 高分”  + I +  “回合”  ,得分由[i]四舍五入);  
  22.         }  
  23.           
  24.         如果 (PlayerPrefs.HasKey( “ 高分”  + I +  “杀死”  )){  
  25.             / /复制玩家的偏好值本地高分数组类  
  26.             。得分由[i]杀死= PlayerPrefs.GetInt( “ 高分”  + i +  “杀死” );  
  27.         }  否则 {  
  28.             / /设置播放器首选项以本地数据  
  29.             PlayerPrefs.SetInt( “ 高分”  + I +  “杀死”  ,得分由[i]杀死。);  
  30.         }  
  31.     }     
  32. }  

但是这样的简单存储一般来说是难以满足需要的。所以我们需要添加一个函数AddNewHighScore:

[浏览器]   鉴于普通 副本
  1.       
  2. 功能 AddNewHighscore(){  
  3.   
  4.     无功 curRounds = PlayerPrefs.GetInt(“highscoreCurrentRounds” );  
  5.     无功 curKills = PlayerPrefs.GetInt(“highscoreCurrentKills” );  
  6.     变种 newHighscorePosition:  整数;  
  7.       
  8.       
  9.     / /检查当前的得分都不错/以上的playersPrefs高分  
  10.       
  11.     / /我们要假设本地和playerprefs数据是一样的吗? - 是的  
  12.           
  13.     (  变种 I:整型 = 0我“numberHighscores,我+ +){  / /为高分人数  
  14.       
  15.         如果 (curRounds>得分由[i]。四舍五入){  
  16.             / /新的得分越高!  
  17.             newHighscorePosition = I;  
  18.             打破;  
  19.         }  否则 ,如果 (curRounds ==得分由[i]。回合&& curKills>得分由[i]。杀死){  
  20.             / /新的分数等于在两轮和杀死更大  
  21.             newHighscorePosition = I;  
  22.             打破;  
  23.         }  / /如果两轮都是平等的,杀死少  
  24.     }  / /如果回合少  
  25.       
  26.       
  27.       
  28.     DEBUG.LOG(newHighscorePosition);  
  29.       
  30.     / /如果是计算什么新houigschore的#会  
  31.       
  32.     / /将其添加到我们的数据并保存。  
  33. }  
脚本的目的就是将当前的最高分与排行榜进行比较并且如果高于榜中的任意一个元素立即跳出并添加进去。

,当然现在还只能在控制台输出数据比如原始数据是1,12:

最高分存储_第5张图片

跳转到前端后修改数值:

最高分存储_第6张图片

在跳转回排行榜就会发现数据发生了改变

最高分存储_第7张图片

完整的脚本HighScoreDisplay.js代码如下:

[浏览器]   鉴于普通 副本
  1. / /这就是所谓的后一个玩家死亡或者从主菜单  
  2.   
  3. / /显示高分  
  4. / /跟踪如下:玩家姓名,查房的高分人数存活并杀死   
  5.   
  6. / /在进入高分菜单,测试,如果我们有一个高的分数,如果我们这样做,请问  
  7. / /播放器输入名称,并把它添加到高分保存数据。  
  8.   
  9.   
  10. 变种 boxStartLocation:Vector2;  / /主界面元素的偏移  
  11. 变种 中心=位置();  / /方便类计算屏幕的中心  
  12.   
  13. 功能 开始(){  
  14.     DEBUG.LOG( “ 键”highscoreCurrentRounds'的值是:“  + PlayerPrefs.GetInt(“highscoreCurrentRounds” ));  
  15.     DEBUG.LOG( “ 键”highscoreCurrentKills'的值是:“  + PlayerPrefs.GetInt(“highscoreCurrentKills” ));  
  16.     AddNewHighscore();  
  17. }  
  18.   
  19. 功能 更新(){  
  20.     center.updateLocation();  / /每帧,检查屏幕已更改,重新计算屏幕的中心值。  
  21.     / / SyncPlayerPrefs();  
  22.     / /启动();  
  23. }  
  24.   
  25. / /绘制一个文本字符串到屏幕  
  26.   
  27. 变种 textGUIStyle:GUIStyle;  / /来控制文字的显示  
  28. 变种 roundsGUIStyle:GUIStyle;  / /控制文本击杀显示器  
  29. 变种 得分=  新的 排行榜[10];  / /名称数组的高分  
  30.   
  31. 。比分[0]名称=  “www.DigitalTutors.com” / /排行榜#1  
  32. 比分[1]名称=。 “ 爸爸” ;  
  33. 比分[2]名=。 “ 凯尔” ;  
  34. 比分[3]名称=。 “ 芳姐” ;  
  35. 比分[4]名称=。 “ 德拉诺” ;  
  36. 比分[5]名称=。 “ 贾斯汀” ;  
  37. 比分[6]名称=。 “ 埃迪” ;  
  38. 比分[7]名称=。 “ 乔希” ;  
  39. 比分[8]名称=。 “ 克里斯” ;  
  40. 比分[9]名称=。 “ 史蒂夫” ;  
  41. 。比分[0]回合= 99;  
  42. 。比分[0]杀死= 999;  
  43. 。比分[1]两轮= 1;  
  44. 。比分[1]杀死= 9;  
  45. 变种 heightOffset:   = 10;  / /多少空间给每个高分水平之间放置  
  46. 变种 roundsOffset:浮动/ /水平偏移柱轮  
  47. 变种 killsOffset:浮动/ /水平偏移击杀列  
  48.   
  49. 变种 numberHighscores:整型 = 8;  / /控制多少循环运行,以显示  
  50.   
  51. 功能 OnGUI(){  
  52.   
  53.     (  变种 I:整型 = 0我“numberHighscores,我+ +){  / /对于高分的数量来显示  
  54.         GUI.Box(矩形(center.offset.x + boxStartLocation.x,  / /绘制一个框的名称  
  55.         center.offset.y + boxStartLocation.y + I * heightOffset,  
  56.         222,34),总分由[i]的名字,textGUIStyle);  / /使用textGUIStyle  
  57.           
  58.         GUI.Box(矩形(center.offset.x + boxStartLocation.x + roundsOffset,  / /绘制一个与轮框  
  59.         center.offset.y + boxStartLocation.y + I * heightOffset,  
  60.         222,34),总分由[i] rounds.ToString(),roundsGUIStyle);  / /使用roundsGUIStyle  
  61.           
  62.         GUI.Box(矩形(center.offset.x + boxStartLocation.x + killsOffset,  / /绘制一个框与杀害  
  63.         center.offset.y + boxStartLocation.y + I * heightOffset,  
  64.         222,34),总分由[i] kills.ToString(),roundsGUIStyle);  / /使用roundsGUIStyle  
  65.     }  
  66. }  
  67.   
  68.     / /排行榜命名方案  
  69.     / /开始键:“高分”  
  70.     / /过去认为,无论设置需要  
  71.       
  72.     / /一个特定的高分是这样的:  
  73.         / / highscore4name  
  74.       
  75.       
  76. 功能 AddNewHighscore(){  
  77.   
  78.     无功 curRounds = PlayerPrefs.GetInt(“highscoreCurrentRounds” );  
  79.     无功 curKills = PlayerPrefs.GetInt(“highscoreCurrentKills” );  
  80.     变种 newHighscorePosition:  整数;  
  81.       
  82.       
  83.     / /检查当前的得分都不错/以上的playersPrefs高分  
  84.       
  85.     / /我们要假设本地和playerprefs数据是一样的吗? - 是的  
  86.           
  87.     (  变种 I:整型 = 0我“numberHighscores,我+ +){  / /为高分人数  
  88.       
  89.         如果 (curRounds>得分由[i]。四舍五入){  
  90.             / /新的得分越高!  
  91.             newHighscorePosition = I;  
  92.             打破;  
  93.         }  否则 ,如果 (curRounds ==得分由[i]。回合&& curKills>得分由[i]。杀死){  
  94.             / /新的分数等于在两轮和杀死更大  
  95.             newHighscorePosition = I;  
  96.             打破;  
  97.         }  / /如果两轮都是平等的,杀死少  
  98.     }  / /如果回合少  
  99.       
  100.       
  101.       
  102.     DEBUG.LOG(newHighscorePosition);  
  103.       
  104.     / /如果是计算什么新houigschore的#会  
  105.       
  106.     / /将其添加到我们的数据并保存。  
  107.   
  108.   
  109. }  
  110.       
  111. 功能 SyncPlayerPrefs(){  
  112.     / /我们的假设是,在播放器首选项中的数据应该凌驾本地数据  
  113.     / /需要这个,看看我们是否有球员首选项键,如果我们这样做,复制到本地  
  114.     / /如果该键不存在,我们需要与当地的数据填充它  
  115.       
  116.     (  变种 I:整型 = 0我“numberHighscores,我+ +){  / /为高分人数  
  117.       
  118.         如果 (PlayerPrefs.HasKey( “ 高分”  + I +  “姓名”  )){  
  119.             / /复制玩家的偏好值本地高分数组类  
  120.             分数由[i]名称= PlayerPrefs.GetString( “ 高分”  + I +  “姓名” );  
  121.         }  否则 {  
  122.             / /设置播放器首选项以本地数据  
  123.             PlayerPrefs.SetString( “ 高分”  + I +  “姓名”  ,分数由[i]名);  
  124.         }  
  125.           
  126.         如果 (PlayerPrefs.HasKey( “ 高分”  + I +  “轮”  )){  
  127.             / /复制玩家的偏好值本地高分数组类  
  128.             。得分由[i] =轮PlayerPrefs.GetInt( “ 高分”  + I +  “轮” );  
  129.         }  否则 {  
  130.             / /设置播放器首选项以本地数据  
  131.             PlayerPrefs.SetInt( “ 高分”  + I +  “回合”  ,得分由[i]四舍五入);  
  132.         }  
  133.           
  134.         如果 (PlayerPrefs.HasKey( “ 高分”  + I +  “杀死”  )){  
  135.             / /复制玩家的偏好值本地高分数组类  
  136.             。得分由[i]杀死= PlayerPrefs.GetInt( “ 高分”  + i +  “杀死” );  
  137.         }  否则 {  
  138.             / /设置播放器首选项以本地数据  
  139.             PlayerPrefs.SetInt( “ 高分”  + I +  “杀死”  ,得分由[i]杀死。);  
  140.         }  
  141.     }     
  142. }  

你可能感兴趣的:(最高分存储)