Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d Unity 2D:PlayerPrefs实现Highscore_Unity3d_Unity3d 2dtools - Fatal编程技术网

Unity3d Unity 2D:PlayerPrefs实现Highscore

Unity3d Unity 2D:PlayerPrefs实现Highscore,unity3d,unity3d-2dtools,Unity3d,Unity3d 2dtools,我需要一些帮助来实现一个节省成本的高分。目前,我有一个分数,从500000开始,每秒下降150分。这是可行的,尽管我死后它仍在继续,我需要修复它。我有第二个高分文本,我希望它显示高分。现在它显示了我死亡的确切分数(例如450875),但当我重新启动游戏时,我似乎无法保存它。我尝试了PlayerPrefs,但不确定如何在代码中应用它。我希望它代表最低的分数,在这个例子中,从500000开始,是有史以来的最低分数。只需注意:kmScore和KMShighScore都只是数字,我在Unity窗口中的分

我需要一些帮助来实现一个节省成本的高分。目前,我有一个分数,从500000开始,每秒下降150分。这是可行的,尽管我死后它仍在继续,我需要修复它。我有第二个高分文本,我希望它显示高分。现在它显示了我死亡的确切分数(例如450875),但当我重新启动游戏时,我似乎无法保存它。我尝试了PlayerPrefs,但不确定如何在代码中应用它。我希望它代表最低的分数,在这个例子中,从500000开始,是有史以来的最低分数。只需注意:kmScore和KMShighScore都只是数字,我在Unity窗口中的分数或highscore之前没有文本。任何帮助都将不胜感激

使用系统集合;
使用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
    ,这更适合

感谢您抽出时间!它没有给我任何错误,但是,重新启动后,高分保持在0。因此,如果我死在497000,它将显示为Highscore,因为这是我的第一次播放,但在按下重新加载按钮后,Highscore将保持在:0。有什么想法吗?这不应该发生。您是否绝对确定在其他脚本中没有使用
PlayerPrefs.SetInt
?尝试在编辑器中运行一次游戏,然后打开r