2016-09-03 2 views
0

Я строию 2-й астероидный шутер в единстве C#. Мне нужно сохранить сердца игрока на следующий уровень. Поэтому я просто сделал счет, чтобы сохранить то, что мне нужно, это сохранить сердце. Счет сохраняется на следующем уровне, поэтому он работает следующим образом: на первом уровне у вас есть, например, в конце 3000 пунктов, и вы переходите на уровень nesxt, тогда он начнет формировать 3000, но если вы нажмете на перезагрузку или если oyu quit you start from 0 и fro первого уровня. Вот как результат работает так же, как и с сердцами. Итак, если вы закончите первый уровень с 1 сердцем, вам нужно перейти на 2 с 1 сердцем. если вы закончите 2 с 3-мя сердечками tn 3 с 3-мя сердечками, начнется, если вы перезапустите перезагрузку или если вы уйдете, то он начнет формирование по умолчанию. Сердце - это пользовательский интерфейс изображений, я думал, что нужно делать, как scor с prefs игроков, но я не уверен, как это сделать.Сохранить сердечки с PlayerPrefs

if (col.gameObject.tag == "AsteroidBig") { 
      if (heart.enabled == true && heart1.enabled == true && heart2.enabled == true) { 
       heart.enabled = false; 
       Instantiate (explosion, col.transform.position, col.transform.rotation); 
       Vector3 pos = new Vector3 (0f, 0f, 0f); 
       Instantiate (player, pos, Quaternion.identity); 
       Destroy (col.gameObject); 
       Destroy (this.gameObject); 
       Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation); 
       Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation); 
      } else if (heart1.enabled == true && heart2.enabled == true) { 
       heart1.enabled = false; 
       Instantiate (explosion, col.transform.position, col.transform.rotation); 
       Vector3 pos = new Vector3 (0f, 0f, 0f); 
       Instantiate (player, pos, Quaternion.identity); 
       Destroy (col.gameObject); 
       Destroy (this.gameObject); 
       Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation); 
       Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation); 
      } else if (heart2.enabled == true) { 
       heart2.enabled = false; 
       Instantiate (explosion, col.transform.position, col.transform.rotation); 
       Vector3 pos = new Vector3 (0f, 0f, 0f); 
       Instantiate (player, pos, Quaternion.identity); 
       Destroy (col.gameObject); 
       Destroy (this.gameObject); 
       Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation); 
       Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation); 
      } else if (heart.enabled == false && heart1.enabled == false && heart2.enabled == false) { 
       Instantiate (explosion, col.transform.position, col.transform.rotation); 
       Destroy (col.gameObject); 
       Destroy (this.gameObject); 
       Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation); 
       Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation); 
       GameOverPanel.SetActive (true); 
      } 
     } 

Если заявление с сердечками выглядит так, оно немного испортилось, но это так. Если вы коснетесь астероида, он проверяет, включено ли 3 сердца, один из них настроен на ложь, тогда, если у вас есть 2 сердца, тогда другой будет ложным и так далее, пока у вас не будет сердец и вы потеряете. Это логика столкновения. Пожалуйста, помогите сохранить это сердце, спросите любой вопрос, потому что я знаю, что он испорчен.

+0

Почему у вас есть сердца как отдельные объекты, а не коллекция? Вы можете просто добавить объекты в «Список () сердца». Ваш оператор if будет просто проверкой свойства 'hearts.Count', и вы можете создать следующий уровень с этим параметром для своих сердец. – Kolichikov

+0

Вы правы, я должен был подумать об этом, но до сих пор я не знал о списке, но есть ли способ с моим кодом, чтобы он оставался неоткаченным, каким-то образом его сохранить? –

+0

Вы используете SceneManager для загрузки нового уровня? Или просто сбросить текущую сцену? – Kolichikov

ответ

0

У вас есть два варианта здесь, в зависимости от того, что проще для вас

1) Создать статический класс Статические классы не сбрасываются при загрузке нового уровня, так что вы можете хранить любую информацию о вашем плеере есть

public class GameData 
{ 
    public static int NumberOfHearts = 3; 
} 

в своем коде вы бы затем обновить NumberOfHearts, чтобы отразить, сколько сердца у вас, когда вы получите тронуты астероид. Например,

GameData.NumberOfHearts--; //We just got touched by an asteroid

2) Сцена Manager (не применяется, если вы используете Application.LoadLevel())

Вы можете создать GameObject для вашего игрока в корне сцены ,
Тогда, когда пришло время, чтобы загрузить ваш уровень, вы могли бы назвать SceneManager.MoveGameObjectToScene(playerObject, "sceneName")

См here для получения дополнительной информации о MoveGameObjectToScene.

В этом случае объект будет перенесен с любыми сценариями и подобъектами, поэтому у вас уже есть все сердца на следующем уровне.

+0

, но как я обкалываю количество сердец ? –

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