Os materiais didáticos aqui disponibilizados estão licenciados através de Creative Commons Atribuição-SemDerivações-SemDerivados CC BY-NC-ND. Você possui a permissão para visualizar e compartilhar, desde que atribua os créditos do autor. Não poderá alterá-los e nem utilizá-los para fins comerciais.
Atribuição-SemDerivações-SemDerivados
CC BY-NC-ND
Cursos / Jogos Digitais / Desenvolvimento com Motores de Jogos I / Aula
O elemento que guarda a quantidade de vidas restantes e que está presente em cada uma das cenas é o elemento Game Controller. Portanto, esse será o elemento o qual alteraremos para passar a suportar as alterações de interface. Abram o script do GameController e façam as alterações iniciais.
A primeira coisa necessária para o nosso script funcionar é uma referência ao objeto que queremos alterar. Assim, criaremos uma variável do tipo Text em nosso script do Game Controller. Para isso, no entanto, precisamos realizar uma nova importação em nosso código, dessa vez, da UnityEngine.UI.
Em seguida, precisamos adicionar uma linha a mais aos métodos de fim de fase e de quebra – uma linha que altere o conteúdo do texto da variável Text criada para o novo valor da quantidade de vidas restantes, mesmo que esse valor tenha sido incrementado ou decrementado. Vejamos o código modificado na Listagem 1.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GameController : MonoBehaviour {
private int robotsLeft = 2;
private string sceneName;
public static GameController instance = null;
public Text robotsLeftText;
// Use this for initialization
void Start () {
if (instance == null) {
instance = this;
} else if (instance != this) {
Destroy(gameObject);
}
DontDestroyOnLoad(gameObject);
}
public void Break () {
robotsLeft -= 1;
if (robotsLeft > 0) {
robotsLeftText.text = "x "+ robotsLeft;
Debug.Log(robotsLeft);
}
Invoke("RestartLevel", 3f);
}
public void LevelEnd () {
robotsLeft += 1;
robotsLeftText.text = "x "+ robotsLeft;
Debug.Log(robotsLeft);
Invoke("NextLevel", 3f);
}
private void RestartLevel () {
sceneName = SceneManager.GetActiveScene().name;
if (robotsLeft >= 0) {
SceneManager.LoadScene(sceneName);
} else {
SceneManager.LoadScene("GameOver");
}
}
private void NextLevel () {
int sceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(sceneIndex+1);
}
}
Pronto! Com essas alterações, já temos uma garantia de o valor do texto da UI ser alterado sempre que a variável for alterada. Para podermos testar, falta apenas irmos até a interface e arrastarmos o objeto de texto para o espaço da variável pública criada no script, a fim de definirmos quem é o objeto com o qual estamos lidando. Vejamos o funcionamento na Figura 5.
Isso só tem um problema. Tente perder outra tentativa, após a primeira, e observe o console.
MissingReferenceException: The object of type 'Text' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
Eita. Deu erro. E agora?
A cena foi recarregada, não é? Se ela foi reiniciada, aquele objeto Text não existe mais, concorda? Um novo foi criado em seu lugar. Mas o nosso script ainda está referenciando o primeiro. E, então, as coisas dão errado. Bem errado! Mas como podemos resolver esse problema?
Não é complicado! Para solucioná-lo, podemos criar, em nosso script do GameController, um método novo responsável por, toda vez que um novo nível surgir, seja ele reiniciado ou fruto de um avanço ao próximo, encontrar o campo de texto daquele nível e atualizar a variável, bem como o seu conteúdo.
Versão 5.3 - Todos os Direitos reservados