2014-10-26 5 views
1

Я пытаюсь сохранить высокий балл в своей игре. Высокий балл обновляется со счетом во время игры. Однако после перезапуска уровня оба (текущий балл и высокий балл) становятся равными нулю.Как сэкономить на счете?

Как это сделать? Какую ошибку я делаю?

Вот мой код:

Сформировать

public class Generate : MonoBehaviour 
{  
    private static int score; 
    public GameObject birds; 
    private string Textscore; 
    public GUIText TextObject; 
    private int highScore = 0; 
    private int newhighScore; 
    private string highscorestring; 
    public GUIText highstringgui; 

    // Use this for initialization 
    void Start() 
    { 
     PlayerPrefs.GetInt ("highscore", newhighScore); 
     highscorestring= "High Score: " + newhighScore.ToString(); 
     highstringgui.text = (highscorestring); 
     InvokeRepeating("CreateObstacle", 1f, 3f); 
    } 

    void Update() 
    { 
     score = Bird.playerScore; 
     Textscore = "Score: " + score.ToString(); 
     TextObject.text = (Textscore); 
     if (score > highScore) 
     { 
      newhighScore=score; 
      PlayerPrefs.SetInt ("highscore", newhighScore); 
      highscorestring = "High Score: " + newhighScore.ToString(); 
      highstringgui.text = (highscorestring); 
     } 
     else 
     { 
      PlayerPrefs.SetInt("highscore",highScore); 
      highscorestring="High Score: " + highScore.ToString(); 
      highstringgui.text= (highscorestring); 
     } 
    } 

    void CreateObstacle() 
    { 
     Instantiate(birds); 
    } 
} 

Bird

public class Bird : MonoBehaviour { 
    public GameObject deathparticales; 
    public Vector2 velocity = new Vector2(-10, 0); 
    public float range = 5; 
    public static int playerScore = 0; 

    // Use this for initialization 
    void Start() 
    {  
     rigidbody2D.velocity = velocity; 
     transform.position = new Vector3(transform.position.x, transform.position.y - range * Random.value, transform.position.z);  
    } 

    // Update is called once per frame 
    void Update() { 
     Vector2 screenPosition = Camera.main.WorldToScreenPoint(transform.position); 
     if (screenPosition.x < -10) 
     { 
      Die(); 
     } 
    }  
    // Die by collision 
    void OnCollisionEnter2D(Collision2D death) 
    { 
      if(death.transform.tag == "Playercollision") 
     { 
      playerScore++; 
      Destroy(gameObject); 
      Instantiate(deathparticales,transform.position,Quaternion.identity); 
     } 
    } 

    void Die() 
    { 
     playerScore =0; 
     Application.LoadLevel(Application.loadedLevel);  
    } 
} 

ответ

2

Проблема заключается в вашей переменной highScore. Это всегда 0. В игре вы спросите

if (score > highScore)

И потому, что вы установили highScore = 0 объявляя эту переменную, score всегда больше.

Мое предложение состоит в том, что вы должны объявить его без значения:

private int highScore; 

В Start() вы должны дать ему значение сохраненного высокого балла, если он существует, и если нет, то дайте ему 0 значения:

highScore = PlayerPrefs.GetInt("highscore", 0); 

Это должно сработать для вас.

1

Эта линия в Start(), на самом деле не делать ничего.

PlayerPrefs.GetInt ("highscore", newhighScore); 

Второй параметр - это возвращаемое по умолчанию значение, если данный ключ не существует. Но вы не используете возвращаемое значение для чего-либо.

Я думаю, что вы имели в виду, чтобы сделать это:

newhighScore = PlayerPrefs.GetInt("highscore"); 

Значение по умолчанию будет 0, если не установлен явно.

+0

спасибо, человек ... никто не возникает, и это когда я останавливаю игру, а затем играю в игру, высокий балл устанавливается в соответствии с новой игрой, которая недавно открылась после выхода из предыдущей игры. Например, когда я оценка 7, и это сохраняет как высокий балл 7. но после выхода игры, а затем перезапустить игру и сделать счет 2, высокий балл становится 2 от 7. – user3866627

Смежные вопросы