Unity3d Unity 2D:PlayerPrefs实现Highscore
我需要一些帮助来实现一个节省成本的高分。目前,我有一个分数,从500000开始,每秒下降150分。这是可行的,尽管我死后它仍在继续,我需要修复它。我有第二个高分文本,我希望它显示高分。现在它显示了我死亡的确切分数(例如450875),但当我重新启动游戏时,我似乎无法保存它。我尝试了PlayerPrefs,但不确定如何在代码中应用它。我希望它代表最低的分数,在这个例子中,从500000开始,是有史以来的最低分数。只需注意:kmScore和KMShighScore都只是数字,我在Unity窗口中的分数或highscore之前没有文本。任何帮助都将不胜感激Unity3d Unity 2D:PlayerPrefs实现Highscore,unity3d,unity3d-2dtools,Unity3d,Unity3d 2dtools,我需要一些帮助来实现一个节省成本的高分。目前,我有一个分数,从500000开始,每秒下降150分。这是可行的,尽管我死后它仍在继续,我需要修复它。我有第二个高分文本,我希望它显示高分。现在它显示了我死亡的确切分数(例如450875),但当我重新启动游戏时,我似乎无法保存它。我尝试了PlayerPrefs,但不确定如何在代码中应用它。我希望它代表最低的分数,在这个例子中,从500000开始,是有史以来的最低分数。只需注意:kmScore和KMShighScore都只是数字,我在Unity窗口中的分
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.UI;
使用UnityEngine.SceneManagement;
公共类游戏:单一行为{
公共游戏对象游戏屏幕;
公共文本评分;
公共文本;高分;
浮动存储内核;
布尔·加莫弗;
私人浮动分数=500000;
无效开始(){
FindObjectOfType().OnPlayerDeath+=OnGameOver;
}
公共无效更新(){
kmScore.text=GetScore().ToString(“F0”);
如果(游戏结束)
{
if(Input.GetKeyDown(KeyCode.Space))
{
场景管理器。加载场景(1);
}
}
}
float GetScore()
{
返回分数-(float)Time.timeSinceLevelLoad*150;
}
void OnGameOver()
{
gameOverScreen.SetActive(真);
kmHighscore.text=GetScore().ToString(“F0”);
}
}
您应该将脚本更改为:
使用UnityEngine;
使用UnityEngine.UI;
使用UnityEngine.SceneManagement;
公共类游戏:单一行为{
常量字符串播放器refs_HIGHSCORE=“High Score”;
const int起始分数=500000,每秒分数=150;
公共游戏对象游戏屏幕;
公共文本kmScore,kmHighscore;
private int allTimeHighScore,actualScore;
私人布尔加莫弗;
私有void Start(){
allTimeHighScore=PlayerPrefs.GetInt(PlayerPrefs\u HIGHSCORE,起始\u SCORE);
gameOver=false;
FindObjectOfType().OnPlayerDeath+=OnGameOver;
kmHighscore.text=allTimeHighScore.ToString(“F0”);
}
私有void更新(){
如果(游戏结束){
if(Input.GetKeyDown(KeyCode.Space)){
场景管理器。加载场景(1);
}
}
否则{
kmScore.text=GetScore().ToString(“F0”);
}
}
private int GetScore(){
return actualScore=起始分数-(int)Time.timesineclevelload*每秒分数;
}
私人空间{
gameOverScreen.SetActive(真);
如果(allTimeHighScore>GetScore()){
kmHighscore.text=(allTimeHighScore=actualScore).ToString(“F0”);
PlayerPrefs.SetInt(PlayerPrefs_HIGHSCORE,allTimeHighScore);
}
gameOver=true;
}
}
关于代码的几个注释:
- 不要在脚本中使用所谓的“幻数”,如果变量是不可变的,请利用
变量const
- 我添加了
的用法,因为您将它声明为gameOver
,并且它没有在类中的任何地方使用。这将在设置为private
时停止计分true
- 将分数类型更改为
,这更适合int
使用UnityEngine;
使用UnityEngine.UI;
使用UnityEngine.SceneManagement;
公共类游戏:单一行为{
常量字符串播放器refs_HIGHSCORE=“High Score”;
const int起始分数=500000,每秒分数=150;
公共游戏对象游戏屏幕;
公共文本kmScore,kmHighscore;
private int allTimeHighScore,actualScore;
私人布尔加莫弗;
私有void Start(){
allTimeHighScore=PlayerPrefs.GetInt(PlayerPrefs\u HIGHSCORE,起始\u SCORE);
gameOver=false;
FindObjectOfType().OnPlayerDeath+=OnGameOver;
kmHighscore.text=allTimeHighScore.ToString(“F0”);
}
私有void更新(){
如果(游戏结束){
if(Input.GetKeyDown(KeyCode.Space)){
场景管理器。加载场景(1);
}
}
否则{
kmScore.text=GetScore().ToString(“F0”);
}
}
private int GetScore(){
return actualScore=起始分数-(int)Time.timesineclevelload*每秒分数;
}
私人空间{
gameOverScreen.SetActive(真);
如果(allTimeHighScore>GetScore()){
kmHighscore.text=(allTimeHighScore=actualScore).ToString(“F0”);
PlayerPrefs.SetInt(PlayerPrefs_HIGHSCORE,allTimeHighScore);
}
gameOver=true;
}
}
关于代码的几个注释:
- 不要在脚本中使用所谓的“幻数”,如果变量是不可变的,请利用
变量const
- 我添加了
的用法,因为您将它声明为gameOver
,并且它没有在类中的任何地方使用。这将在设置为private
时停止计分true
- 将分数类型更改为
,这更适合int
PlayerPrefs.SetInt
?尝试在编辑器中运行一次游戏,然后打开r